2013-12-09 66 views
6

有時我想寫兩個模板,如:爲什麼C++不允許模板重載?

template <typename Type1> 
class A{ 
    ... 
}; 

template <typename Type1, typename Type2> 
class A{ 
    ... 
}; 

但似乎是不合法的有兩個模板共享相同的名稱,但有不同的參數。我必須將它命名爲A_1A_2。我認爲這可能是有用的,如果我可以做到這一點,特別是在執行Functors時。

爲什麼C++不允許這樣做?在某些情況下難以實施還是模棱兩可?這將在更高版本的C++上得到支持嗎?

+7

出於同樣的原因,C++不允許具有相同名稱的兩個類。 – Jack

+2

使用C++ 11可變參數模板http://en.wikipedia.org/wiki/Variadic_template – higuaro

+0

您可以使用默認模板參數來近似它。 –

回答

12

這是非常有用的,但正如你所說,C++不允許你直接這樣做。但是,你可以用部分專業化做幾乎相同的事情。

如果使用可變參數模板在C++ 11,你可以做以下這是特別容易:

template <typename... T> 
struct A; // Declared but not defined 

template <typename T, typename U> 
struct A<T, U> 
{ 
    // definition of the two-parameter case 
}; 

template <typename T> 
struct A<T> 
{ 
    // definition of the one-parameter case 
}; 

實際上,這可以讓你有A<T, U>A<T>作爲完全獨立的類型。嘗試實例化A以及更多模板參數將導致編譯錯誤,因爲一般情況下未定義(如果需要,可以使用static_assert給出一個很好的錯誤消息)。

使用默認模板參數(設置爲空虛擬結構或void)可以在C++ 03中實現類似的功能,但是C++ 11版本更好。

0

一個簡單的(可能的)解決方案,將有第二個模板參數的默認值。 這樣您只能實現一個模板,並且可以使用一個模板參數調用它,並使用默認的第二個模板,或者覆蓋默認值。

相關問題