2017-12-09 11 views
2

私は、いくつかの実装されたメソッドといくつかの仮想メソッドを持つ、テンプレート化されたインターフェイスクラスを持っています。ディレクティブと部分的な特殊化の使用

いくつかのメソッドのシグネチャを変更するには、そのメソッドを特化する必要がありますが、それ以外は同じままです。

usingディレクティブを使用して元のテンプレートと同じメソッドを戻す方法がありますか、直接コールバックするか、別の方法でコピーする必要があります。専門化?

template <typename T> 
struct X { 
    void faa(T t) const { std::cout << t << '\n'; } 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <> 
struct X<void> { 
    void faa() const { std::cout << "none\n"; } 

    // Something along these lines 
    // using X<T>::foo; 
    // void foo() const { X<T>::foo(); } 
}; 

答えて

4

と思われます。 usingディレクティブを使用して異なる署名を持つXの関数を取得することはできません。テンプレートから特殊化にすべてをコピーするよりも良い回避策があります。あなたは "共通の基底クラス"を使うことができます。このようにして

template <typename T> 
struct X_base { 
    void foo() const { std::cout << "foo\n"; } 
}; 

template <typename T> 
struct X : public X_base<T> { 
    void faa(T t) const { std::cout << t << '\n'; } 
}; 

template <> 
struct X<void> : public X_base<void> { 
    void faa() const { std::cout << "none\n"; } 
}; 

、ちょうどX_base<void>::fooようX<void>::foo行為、X<T>::faaX<void>::faaが互いに干渉しないながら。

関連する問題