Как инициализировать массив при использовании шаблона - PullRequest
0 голосов
/ 10 декабря 2011

Я создал шаблон массива для личного использования.

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 ]

3 голосов
/ 10 декабря 2011

Поскольку ваш класс является агрегатом, вы можете инициализировать его с помощью обычного синтаксиса скобок:

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

То же самое относится и к std::array<int, 3>.

2 голосов
/ 10 декабря 2011

В новом стандарте 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);
} 
0 голосов
/ 10 декабря 2011

Вы должны указать тип и размер массива при определении переменной:

Vector<int, 10> test;

Однако вы не можете назначить массив-член как обычный массив. Вы должны назначить каждый элемент отдельно:

for (int i = 0; i < 10; i++)
    test.data[i] = i;  // If instantiated with type "int"
0 голосов
/ 10 декабря 2011

Вы можете только инициализировать массив в точке, которую вы определяете it:

Vector<unsigned char, 10> test;

Вот ваш массив, вы закончили его определение, ваш шанс инициализировать его прошел.

Редактировать: Увидеть ответ Мэта, памятку мне: у меня есть , чтобы прочитать на C ++ 11, и скоро ...: - /

Редактировать 2: Я просто дал информацию о том, что было не так. Керрек С.Б. располагает информацией о том, как это сделать правильно. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...