2014-12-05 252 views
1

我試圖根據我的模板中寫的內容來更改成員變量的類型。C++中的模板類型成員變量

例如A<64, 64>應該讓我的成員int_128 不幸的是,我不知道如何使用模板類型,我發現每個教程只對模板函數有幫助。

我的課看起來像

template<int x, int y> 
class A{ 

    private: 
    TYPETOBEGENERIC m_variable 
} 

有沒有辦法做到這一點在構造像

if(x+y <= 64){ TYPETOBEGENERIC = int_64 } 
    else{TYPETOBEGENERIC = int_128} 

我不想在模板<中添加特定類型>。結構A < 64,64>應該不變。

+0

C++沒有泛型,它有模板,它們不是相同的東西,甚至沒有類似的東西。 – EJP 2014-12-05 23:22:29

回答

4
constexpr bool lessThan64(int a,int b) { 
    return (a+b) < 64; 
} 
template<int x, int y> 
class A{ 
    using type = typename std::conditional<lessThan64(x,y),int_64,int_128>::type; 
    private: 
    type m_variable; 
} 

使用constexpr函數來獲取編譯時元編程,我們可以在編譯時評估這些值,然後使用std ::有條件的兩種類型之間進行選擇。

編輯: 對於兩種以上的類型,您可以使用可變參數模板或顯式專業化。

template<unsigned int I,typename... Sizes> 
struct select; 

template<unsigned int I,typename T,typename... Sizes> 
struct select<I,T,Sizes...>:select<N-1,Cases...> 
{ 
}  

template<unsigned int I,typename T,typename... Sizes> 
struct select<O,T,Sizes...> 
{ 
    using type =T 
} 

You would obviously need a constexpr function to differentiate between the types. 
+0

這是我正在尋找。感謝朋友。 – TreeOfLife 2014-12-05 23:13:39

+0

不客氣的人clearcase正在浪費我的時間today.I很樂意幫助 – West 2014-12-05 23:17:24

+0

只是最後一個問題,如果我想在這裏使用第三個變量,讓我們只是說一個int_32作爲例子,我將如何需要改變這一點。 std:條件似乎只適用於真/假狀態。 – TreeOfLife 2014-12-05 23:23:01

0

您可以使用預處理器命令來參數化int_之後的位數,但這是不好的編程。

#define TYPE(bits) int_##bits 

現在聲明一個32位的整數(假設這樣的類型存在)你寫TYPE(32) my_var;。可能有更好的方法來做任何你想做的事情。

相關問題