2011-08-26 95 views
1

我需要某種方式來實現「反向模板別名」。所以我會使用模板typedef在編譯時選擇正確的類。我想做到以下幾點:反向模板別名

typedef ClassA Temp<int>; 
typedef ClassB Temp<char>; 

ClassA和ClassB的不是模板類,但我想通過使用模板來選擇合適的班級。所以如果需要Temp> < int>,它實際上會使用ClassA。在C++中甚至有可能這樣嗎?我嘗試了以下,但它沒有奏效。

template<> 
typedef ClassA Temp<int>; 

template<> 
typedef ClassB Temp<char>; 

我得到了以下錯誤在GCC

error: template declaration of ‘typedef’ 
+0

你能給出你想要實現的代碼示例嗎?在你的例子中,ClassA和ClassB是具體類型,而不是模板。 –

+0

而且你不能模擬typedef。但是有一些解決方法,取決於你想要做什麼。 –

回答

2

沒有,typedef不能定義類型模板,只有類型。你可以做的兩個最接近的事情是:

template <typename T> 
struct Temp; 

template <> 
struct Temp<int> : ClassA {} 

template <> 
struct Temp<char> : ClassB {} 

所以你寫的只是Temp<int>,但它是一個派生類,而不是類本身,或

template <typename T> 
struct Temp; 

template <> 
struct Temp<int> { typedef ClassA Type; } 

template <> 
struct Temp<char> { typedef ClassB Type; } 

這樣你就可以得到ClassAClassB自己,但你必須寫Temp<int>::Type

+0

謝謝!第二個例子正是我想要的。我應該想到這一點。在派生類的例子中,如果我不向模板類添加任何東西,是不是會像使用實際的類一樣? – Justin

+0

@Justin:不,它不會是一個正式的類型。你可以將'Temp '實例傳遞給'ClassA'參數,但不能反過來。 –

+0

我該如何稱呼新的? ptr = new Temp :: Type()不起作用。 – Justin