在 C++17 中使用参数包的类模板参数推导
Class template argument deduction with a parameter pack in C++17
我正在尝试在类上实现类模板参数推导。我的类在类型T
(将是一个数字(上模板化,构造函数在std::size_t
参数包上模板化。
#include <iostream>
#include <utility>
#include <experimental/array>
template < typename T, std::size_t S>
struct my_array
{
template < typename ...SizeTypes>
my_array( SizeTypes&& ... s ):
data( std::forward<std::array<std::size_t, S>>( std::experimental::make_array<std::size_t>( std::forward<SizeTypes>(s)... ) ) )
{
}
T value = T();
std::array<std::size_t, S> data;
};
template < typename T, class...Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;
int main()
{
my_array<double> a(3, 4, 5);
a.value = 2.32;
std::cout << a.value << ", " << a.data[1] << std::endl;
return 0;
}
我收到以下错误:
prog.cc: In function 'int main()':
prog.cc:24:20: error: wrong number of template arguments (1, should be 2)
my_array<double> a(3, 4, 5);
演示
关于如何正确实施这一点的任何想法?
T
在这里是非推导的上下文:
template < typename T, class... Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;
由于无法推导T
,因此永远不会选择此演绎指南。没有一个隐式指南是可行的。
相反,您应该像标准库一样执行:
template <class T, class... U>
my_array(T, U...) -> my_array<T, 1 + sizeof...(U)>;
另外,正如之前多次问过的那样,这不是一回事:
my_array<double> a(3, 4, 5);
你要么推论一切,要么什么都不推论。所以这应该是:
my_array<double, 3> a(3, 4, 5); // no deduction
my_array b(3.0, 4, 5); // full deduction, b is also my_array<double, 3>
相关文章:
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 在 C++17 中调用具有不同参数类型的构造函数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- C++17.处理使用 auto 相关的模板参数.代码排序困难
- 在C++17中,lambda是否可以作为模板参数传递
- C++17中没有自动参数的模板lambdas
- C++17 之前模板参数包"Folding":惯用方法
- C++17的可选和可变顺序函数参数
- 在 C++17 中使用参数包的类模板参数推导
- 检查模板类型 T 是否为 C++17 中的可变参数包的一部分
- C++17 中函数参数的指针对齐方式
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 为什么 C++17 标准没有带来部分类模板参数扣除?
- 为什么当我提供一些模板参数时,C++17 模板类推导不起作用?
- std::make_move_iterator 自 C++17 的类模板参数推导以来是多余的吗?
- C++17模板演绎指南不用于空参数集?
- C++17中不定参数函数的误差
- C 中类模板的模板参数扣除17:我做错了吗?