2016-01-22 4 views
2

Я хочу заполнить шаблон целыми числами из массива, но это не похоже на C++. Пример:Вставить данные массива в шаблон

Я определяю постоянный массив с помощью целых чисел.

const int array[4] = {0, 1, 2, 3}; 

Мой шаблон работает так:

template<int T> TestClass ... 

В дальнейшем первый способ не является проблемой, но второй способ не компилируется:

TestClass<12> ...   // works 
TestClass<array[0]> ... // does not work 

Компилятор говорит, что оператор '[' не допускается в temlate. Но в чем причина этого и как я могу решить эту ситуацию элегантно? Можно ли также использовать счетчик i из for -loop выбрать Integer массива, например:

TestClass<array[i]> 
+1

Нет шаблонов в [tag: c], поэтому не помещайте вопрос как [tag: c]. –

+0

Извините, слишком быстро! Ты прав. – EarlyEarl

+0

Повторите попытку, используя массив 'constexpr' и соответствующий синтаксис (не скобки для создания экземпляра шаблона). – LogicStuff

ответ

3

Включите массив в constexpr переменной:

constexpr int array[4] = {0, 1, 2, 3}; 

или даже лучше:

constexpr std::array<int, 4> myArray{0, 1, 2, 3}; 

Поскольку ваш массив будет constexpr, его использование будет действовать во время компиляции.

Обязательно включите C++ 14 для версии std::array.

+0

Это очень интересно. Редактор по-прежнему отмечает ошибку, но компилирует (почему?). Когда я пытаюсь объявить шаблоны в цикле ** с контуром i **, он не компилируется: 'TestClass ' Есть и трюк? – EarlyEarl

+1

Ваша переменная 'i' должна быть' constexpr'. Поскольку у вас не может быть параметра функции 'constexpr', вы должны иметь' i' в качестве параметра шаблона. –

+0

Но я не могу увеличить _constant counter-variable_ 'i' в for-loop ...? – EarlyEarl

0

интегрального параметра шаблона типа, такие как межд в классе шаблон TestClass ... должен быть константой времени компиляции, поэтому такой код не будет компилироваться.

+0

Но массив объявляется постоянным. Не является ли время компиляции постоянным? Как я могу использовать какое-то красивое упорядоченное целое (из массива) в шаблоне? – EarlyEarl

+1

Чтобы сделать это время компиляции, вы должны объявить его как ** constexpr ** –

Смежные вопросы