2017-01-12 4 views
3

std::enable_ifに特化したメンバ関数を持つ構造体を作成するにはどうすれば実装から宣言を分割できますか?事前にstd :: enable_ifを使用するときに、宣言と実装を分割する方法

例コード(ideone中)

struct node 
{ 
    template < class T > 
    void analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type* = 0) 
    { 
    std::cout << "is_arithmetic type " << t << "\n"; 
    } 

    template < class T > 
    void analyze(T t, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0) 
    { 
    std::cout << "is_floating_point type " << t << "\n"; 
    } 

    void analyze(bool t) 
    { 
    std::cout << "is bool type " << t << "\n"; 
    } 
}; 

ありがとう!ただ、いずれかのテンプレート法などの

答えて

4

:あなたは(あなたがメンバ関数のための部分的な特殊化を行うことができない)、ここでテンプレート特化を持っていない

struct node { 
    template <class T> 
    void analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type* = 0); 

}; 

template <class T> 
void node::analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type*) { 
    std::cout << "is_arithmetic type " << t << "\n"; 
} 

注意、あなたは別のオーバーロードを持っています。

+0

これは明らかでした。私はいくつかの他のバージョンを試しました。どうもありがとう!あなたは正しいです、私はここでオーバーロードしています。 – zussel

1

私は別のヘルパー関数とタグディスパッチを記述します。

template < class T > 
void analyze(T t, int_tag); 

template < class T > 
void analyze(T t, float_tag); 

void analyze(bool t, bool_tag); 

template<class T> 
auto get_tag(); 

void analyze(T t){ return analyze(t, get_tag<T>()); 

は、今、私たちは、タグディスパッチを経由して過負荷から過負荷ルーティング(get_tag)を分割します。

タグを定義する方法(std::integral_constantまたはstruct int_tagまたはtag<int>など)は、あなた次第です。相互に互換性がなく空でなければなりません。

どのようにget_tagも書かれています。 (C++ 17)、またはstatic_ifまたはSFINAEを使用するか、またはC++ 11/14のtraitsクラス構成を使用します。

get_tagの定義は、実装されていないanalyzeのインターフェイスの一部です。オーバーロード解決ルールを直接分離する場合はenableを使用する代わりに、それを公開し、ビジネスロジックの実装を別の場所に配置します。

+0

これは良い汎用的な解決策ですが、 'enable_if'を使って問題を解決することができます。しかし、私はそれを念頭に置いておきます。ご回答有難うございます! – zussel

関連する問題