2016-05-30 15 views
1
#include <iostream> 

template <typename T1, typename T2> 
class B{ 
public: 
    void update(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; } 
    void func1(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; } 
    void func2(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; } 
}; 

template <typename T1> 
class B<T1, int>{ 
public: 
    void update(){ std::cerr<<__PRETTY_FUNCTION__<<"(specialization)"<<std::endl;} 
}; 

int main(){ 
    B<int, double> b1; 
    b1.update(); 
    b1.func1(); 
    B<int, int> b2; 
    b2.update(); 
    //b2.func1();//there's no function 'func1' in B<int,int> 
} 

私は、特定のテンプレートパラメータ(データ型)用update機能を特化したいです。部分特殊

私はtemplate class Bを特化しようとしましたが、メンバー全体の機能を再度実装する必要があるようです。

他のメンバーは特殊化間で正確に同じであるため、メンバー全体を再実装するのは面倒です。

この場合の回避策はありますか?

+0

[C++テンプレート部分的な特殊メンバ関数]の可能な重複(http://stackoverflow.com/questions/15374841/c-template -partial-specialization-member-function) – LogicStuff

答えて

2

タグ・ディスパッチupdateへの呼び出し:

template <typename> struct tag {}; 

template <typename T1, typename T2> 
class B 
{ 
public: 
    void update() 
    { 
     return update(tag<B>()); 
    } 

private: 
    template <typename U1> 
    void update(tag<B<U1, int> >) 
    { 
     // specialization 
    } 

    template <typename U1, typename U2> 
    void update(tag<B<U1, U2> >) 
    { 
     // normal 
    } 
}; 

DEMO

+0

うわー。それは魔法です!ありがとうございました。 –

関連する問題