2012-08-04 46 views
4

我很新的C++ 2011的可變參數模板,我想知道,如果一招存在做以下的事情:解開一個可變參數模板類的模板參數,常量和常量數組

template<typename T, unsigned int... TDIM> class VariadicTest 
{ 
    public: 
     static const unsigned int order_const = sizeof...(TDIM); 
     static const unsigned int size_const = // TDIM1*TDIM2*TDIM3... 
     static const unsigned int dim_const[order_const] = // {TDIM1, TDIM2, TDIM3...} 
                  // if not possible : 
                  // dim_const[64] = {TDIM1, TDIM2, TDIM3, 0, ..., 0} 

}; 

有沒有什麼「竅門」做這樣的事情?

非常感謝。

+0

的'size_const'應該是簡單的(創建一個返回的乘法'constexpr'可變參數模板功能的頭時間尾巴 - 或頭部的價值,如果沒有尾巴)。數組初始化是一個棘手的部分... – 2012-08-04 00:40:25

+0

事實上,問題中提出的語法將是無效的,因爲您無法在成員聲明中爲靜態數組提供值......被說,問題會如果將初始化移動到定義,則同樣困難:) – 2012-08-04 00:48:31

回答

4

這裏是實現兩個其他的功能的方式:

template<unsigned int... T> struct mul; 
template<unsigned int L,unsigned int... T> struct mul<L,T...> 
{ 
static const int val= L*mul<T...>::val; 
}; 
template<unsigned int L> struct mul<L> 
{ 
static const int val= L; 
}; 

template<typename T, unsigned int... TDIM> class VariadicTest 
{ 
    public: 
     static const unsigned int order_const = sizeof...(TDIM); 
     static const unsigned int size_const = mul<TDIM...>::val; 
     static const unsigned int dim_const[order_const]; 
}; 
template<typename T, unsigned int... TDIM> 
const unsigned int VariadicTest<T,TDIM...>::dim_const[order_const] = {TDIM...}; 

測試:http://liveworkspace.org/code/cfb0ec09a05931cfcc00edf29866e716

1

這裏有一個部分答案,它確實是order_constsize_const。但我看不到如何去做dim_const呢。

#include<iostream> 
using namespace std; 

template<typename T, unsigned int... TDIM> 
class VariadicTest; 

template<typename T> 
class VariadicTest<T> 
{ 
    public: 
     static const unsigned int order_const = sizeof...(TDIM); 

     static const unsigned int size_const = 1; 
}; 
template<typename T, unsigned int baseTDIM, unsigned int... others> 
class VariadicTest<T, baseTDIM, others...> 
{ 
    public: 
     static const unsigned int order_const = sizeof...(TDIM); 
     static const unsigned int size_const = baseTDIM * VariadicTest<T,others...> :: size_const;  
}; 

int main() { 
     VariadicTest<double, 9, 4, 5> x; 
     cout << x.order_const << endl; 
     cout << x.size_const << endl; 
} 
+0

呃...不是'order_const'已經在問題中解決了嗎? (即'sizeof ...(TDIM)'應該被轉換成模板可變參數部分的元素數 – 2012-08-04 00:41:12

+0

其實order_const不是問題,問題是size_const和dim_const ... – Vincent 2012-08-04 00:45:23

+0

@DavidRodríguez- dribeas,你說得對,我認爲我開始這樣做是爲了練習這個遞歸,我會把'sizeof ...'放回去。 – 2012-08-04 10:55:24