2011-04-07 148 views
0

隨着模板號碼包裝結構模板參數類依賴於構造

template <typename T> 
Num<0> id(T x)  { return Num<0>(); } 
Num<1> id(int x) { return Num<1>(); } 
Num<2> id(double x) { return Num<2>(); } 
Num<3> id(char x) { return Num<3>(); } 

我可以使用decltype和初始化一個Zod結構的m_i構件的id返回參數的類型:

template <typename T> 
struct Zod { 
    Zod(T x) { m_i = identity<decltype(id(x))>::type::n; } 
    int m_i; 
}; 

不過,我真的很想對於Zod結構有初始化到m_i被設置爲值的第二整數模板參數。

template <typename T, int I = ?> 
struct Zod { ... } 

這似乎可能的,如在identity/decltype表達式計算爲一個編譯時間常數;例如,這是在全局範圍內罰款:

char c; 
static const int g = identity<decltype(id(c))>::type::n; 

的問題是,在構造函數的參數x中未提供Zod的模板聲明的範圍。可以做到嗎?

+0

我想使'm_i'靜態const不是一個選項?你想要什麼來實現的,出於好奇? – 2011-04-07 22:14:31

回答

2

完全有可能 - 只要通過*((T*)nullptr)就可以獲得任意類型的左值,而不管它的可構造性如何。畢竟,你實際上用構造函數參數所做的所有事情是將它傳遞給id,然後decltype,這在模板中是完全可行的,因爲你知道x的類型是T

template<typename T, int I = identity<decltype(id(*((T*)nullptr)))>::type::n> struct Zod { 
    ... 
}; 
+0

啊哈!我一直在試圖構建*需求*在我列出的方式來使用值的問題。可能它不存在。 – user2023370 2011-04-07 22:39:49

+0

很不錯的答案也一樣,三江源。 – user2023370 2011-04-07 23:50:48