2015-12-06 27 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

您需要一個編譯時循環(可以通過編譯時遞歸或variadic模板參數包擴展來實現)。 – 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 0將用於填充包擴展後的臨時數組(第一個是防止0長度數組錯誤) ,http://stackoverflow.com/a/25683817/3953764 –

+0

'static_cast '只是爲了抑制未使用的變量警告?我想它必須像'(void)unused_var'一樣,就像我一直看到的一樣... –

相關問題