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

How to initialize an array when using a template

本文关键字:初始化 数组      更新时间:2023-10-16

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

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有关于如何做正确的信息。: -)