如何在使用模板时初始化数组

时间:2011-12-10 17:03:18

标签: c++ arrays templates

我创建了一个供我个人使用的数组模板。

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循环来单独初始化元素。

4 个答案:

答案 0 :(得分:3)

由于您的类是聚合,因此可以使用通常的大括号语法对其进行初始化:

Vector<int, 3> x = { { 1, 2, 3 } };

完全相同的事情适用于std::array<int, 3>

答案 1 :(得分:2)

在新标准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);
} 

答案 2 :(得分:0)

您只能在定义的位置初始化数组:

Vector<unsigned char, 10> test;

有你的数组,你完成了它的定义,你初始化它的机会已经过去了。

编辑:看到Mat的回答,给我回复:我来阅读C ++ 11,很快......: - /

编辑2:我刚刚提供了有关错误的信息。 Kerrek SB提供了有关如何正确操作的信息。 ; - )

答案 3 :(得分:0)

定义变量时必须提供数组的类型和大小:

Vector<int, 10> test;

但是,您无法像普通数组一样分配给成员数组。您必须分别分配每个元素:

for (int i = 0; i < 10; i++)
    test.data[i] = i;  // If instantiated with type "int"