2014-04-04 66 views
2

我四處尋找一個很好的解決方案,以避免每個模板類的spezialization上的代碼重複。避免多重C++模板spezialization上的代碼重複

下面是一個例子代碼:

template<class T> 
class C 
{ 
    int foo(); 
} 

現在對於違約的定義:

template<class T> 
C<T>::foo() { return 0; } 

現在特殊的模板

template<> C<int>::foo() { ... do a lot of stuff and return n .... } 
template<> C<double>::foo() { ... do a lot of stuff and return n .... } 
template<> C<int>::foo() { ... do a lot of stuff and return n .... } 

的spezailization現在我不得不重複代碼爲spezilization。但通常它是相同的代碼。

我的問題是: 什麼是避免代碼重複的最佳解決方案,以及如何隱藏實現?也許通過使用noname命名空間或impl命名空間?

親切的問候, 彼得以避免重複代碼使用一個基類來處理通用實現

回答

1

您可以像使用其他任何類一樣進行操作:將樣板代碼提取到模板類中的另一個(專用)函數,並在專業化中調用此代碼。

template<class T> 
class C 
{ 
    int foo(); 

    void bar() { /* does lot of stuff ... */ } 
}; 

template<> int C<int>::foo() { bar(); return n .... } 
template<> int C<double>::foo() { bar(); return n .... } 

,我怎麼能隱藏實現?也許通過使用noname命名空間或impl命名空間?

通過具有編譯單元特定的未命名名稱空間,實際上不可能隱藏模板代碼的實現。

如果您的目標主要是獲得更清晰的可讀模板頭文件,則可以將實現分解爲另一個包含的文件。這些通常被命名爲.tcc.icc,在大多數C++實現標準頭文件中都有這種技術的示例。

+0

是否也可以將bar()隱藏在頭文件中的未命名名稱空間內? – Peter

+0

@Peter不幸的是不適用於模板。匿名(未命名)命名空間與它們所在的編譯單元相關並且是私有的。由於模板類沒有(主)編譯單元,恐怕這是行不通的。 –

1

方式一:

template <class T> 
class base_C 
{ 
    void generic_foo(){...} 
}; 

template <> 
class C <SpecialType> : base_C<SpecialType> 
{ 
    void foo() 
    { 
     SpecialType::custom_foo(); 
     base_C<SpecialType>::generic_foo(); 
    } 
}; 

的想法begind這是foo分裂成更通用的部件和把它們放入base_C。有了這個C::foo的每個專業化將有一個最小量的自定義代碼。