如何在使用模板时初始化数组
How to initialize an array when using a template
我创建了一个数组模板供我个人使用。
template <typename T, int size>
struct Vector {
T data[size];
};
我尝试像这样初始化数据:
Vector<unsigned char, 10> test;
test.data[] = {0,1,2,3,4,5,6,7,8,9};
我的编译器最后抱怨了一些关于"期望表达式"的事情。有人知道我在做什么吗?我希望能够使用这种类型的初始化,你一次给它整个数组定义,而不是使用for循环来初始化每个元素
因为你的类是一个聚合,你可以用通常的大括号语法初始化它:
Vector<int, 3> x = { { 1, 2, 3 } };
同样的事情也适用于std::array<int, 3>
。
在新标准c++ 11中,您可以使用std::initalizer_list
来获得所需的结果,参见下面的示例。
#include <iostream>
#include <algorithm>
template <typename T, int size>
struct Vector {
T data[size];
Vector<T, size> (std::initializer_list<T> _data) {
std::copy (_data.begin (), _data.end (), data);
}
// ...
Vector<T, size>& operator= (std::initializer_list<T> const& _data) {
std::copy (_data.begin (), _data.end (), data);
return *this;
}
};
int
main (int argc, char *argv[])
{
Vector<int, 10> v ({1,2,3,4,5,6}); // std::initializer_list
v = {9,8,7,6,5,4,3,2,1,0}; // operator=
}
如果你使用的是c++ 11之前的标准,这真的有点麻烦,你最好的选择是实现类似于使用std::vector
时可用的功能。
#include <iostream>
#include <algorithm>
template <typename T, int size>
struct Vector {
T _data[size];
Vector (T* begin, T* end) {
std::copy (begin, end, _data);
}
// ...
void assign (T* begin, T* end) {
std::copy (begin, end, _data);
}
};
int
main (int argc, char *argv[])
{
int A1[4] = {1,2,3,4};
int A2[5] = {99,88,77,66,55};
Vector<int, 10> v1 (A1, A1+4);
// ...
v1.assign (A2, A2+5);
}
在定义变量时必须提供数组的类型和大小:
Vector<int, 10> test;
不能像普通数组那样对成员数组进行赋值。您必须分别为每个元素赋值:
for (int i = 0; i < 10; i++)
test.data[i] = i; // If instantiated with type "int"
你只能在定义时初始化数组:
Vector<unsigned char, 10> test;
这就是你的数组,你已经完成了它的定义,你初始化它的机会已经过去了。
编辑:看到马特的回答,提醒我:我必须阅读c++ 11,很快…: -/
编辑2:我只是给出了错误的信息。Kerrek SB有关于如何做正确的信息。: -)
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组