尝试一些模板及其用途:
我在这里处理这个简单的结构:
for (size_t i = 0; i < p_size; i++)
我想以这种方式或类似方式使用它:
template<typename T, size_t n> // templated but not variadic
struct myArray {
static const size_t SIZE = n;
T arr_[SIZE];
myArray() {} // Default Constructor
template<class... U> // Initialization Constructor
myArray( U pack... ) { // Templated with variadic parameters of
// type U = T upto SIZE = n;
arr_ = pack...;
}
};
在visual studio 2017RC中,我不断收到此编译错误:
int main() {
myArray<char, 6> arr1{ 'a', 'b', 'c', 'd', 'e', 'f' };
myArray<int, 4> arr2{ 1, 2, 3, 4 };
// Or like this:
myArray<char, 6> arr1 = { 'a', 'b', 'c', 'd', 'e', 'f' };
myArray<int, 4> arr2 = { 1, 2, 3, 4 };
}
不确定我在这里缺少什么或在初始化构造函数中做什么。
答案 0 :(得分:3)
编写该构造函数的可能方法是
template <class ... U>
myArray( U ... pack ) : arr_ { pack... }
{ }
代码中的两个错误
(1)...
在声明中的包名之前;所以
myArray ( U pack ... )
// ..............^^^ wrong
和
myArray ( U ... pack )
// .........^^^ correct
(2)有很多模式可以使用可变参数包但是
arr_ = pack...;
不正确。
使用带有C风格阵列的可变参数包的常用方法是初始化;也就是说,使用构造函数,在初始化列表中。
所以
myArray( U ... pack ) : arr_ { pack... }
// .....................^^^^^^^^^^^^^^^^
但请记住,像这样的构造函数是危险的,因为没有关于包的元素数量的检查(如果大于SIZE
程序的行为是未定义的(这通常是,成为:程序崩溃)。避免这个问题的一种方法是在构造函数的主体中添加static_assert()
;类似
template <class ... U>
myArray( U ... pack ) : arr_ { pack... }
{ static_assert( sizeof...(U) <= N , "too much values" ); }