2015-12-06 5 views
2

У меня есть шаблонный класс MyClass, и я хочу запустить его для различных параметров, чтобы измерить некоторые значения. Я знаю точные параметры перед компиляцией, поэтому я предполагаю, что должен быть способ достижения цели.Как передать constexpr в качестве параметра шаблона?

Мой код до сих пор:

template <int T> 
class MyClass { /*...*/ }; 


constexpr int PARAMS[] = {1,2,3 /*, ...*/}; 
for (constexpr auto& t: PARAMS) { 
    MyClass<t> myClass; 
    // ... do sth 
} 

Однако компилятор (GCC v4.9.2, C++ 11) не принимает этого. Я также попытался использовать const вместо constexpr, который тоже не работает.

Возможно ли это чем-то вроде этого? Я действительно не хочу использовать макросы вообще.

+0

Цикл выполняется во время выполнения, а не во время компиляции. Шаблоны разрешены во время компиляции. –

+1

Вам понадобится цикл времени компиляции (который может быть реализован посредством репликации времени компиляции или расширения пакета параметров вариационного шаблона). – Constructor

+0

использовать рекурсию вместо –

ответ

5
#include <utility> 
#include <cstddef> 

constexpr int PARAMS[] = { 1, 2, 3, /*...*/ }; 

template <int N> 
void bar() 
{ 
    MyClass<N> myClass; 
    // do sth 
} 

template <std::size_t... Is> 
void foo(std::index_sequence<Is...>) 
{ 
    using dummy = int[];  
    static_cast<void>(dummy{ 0, (bar<PARAMS[Is]>(), 0)... }); 

    // (bar<PARAMS[Is]>(), ...); since C++1z 
} 

int main() 
{ 
    foo(std::make_index_sequence<sizeof(PARAMS)/sizeof(*PARAMS)>{}); 
    //       <std::size(PARAMS)> since C++1z 
    //       <PARAMS.size()> for std::array<int,N> PARAMS{}; 
} 

DEMO

+0

Можете ли вы объяснить, почему нужны '0'? О, я думаю, что я понял это сейчас ... это оператор запятой там, я думаю ... –

+0

@ChrisBeck 0s будет использоваться для заполнения этого временного массива после расширения пакета (первый из них - для предотвращения ошибки массива 0 длины) , http://stackoverflow.com/a/25683817/3953764 –

+0

'static_cast ' это просто для предотвращения предупреждения неиспользуемой переменной? Я предполагаю, что он должен быть таким же, как '(void) unused_var', как я всегда видел ... –

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