2017-03-17 12 views
2

Stackoverflowのメンバーの1つから次のコードをコピーしました。それはうまくいく。みんなありがとう!enable_ifで次のC++コードの戻り値の型を設定する方法

しかし、私はどこで戻り値が定義されているか把握できませんでした。帰りの値の型は何ですか?

戻り値の型を無効(戻り値なし)に変更する場合はどうすればよいですか?

また、コードのこの部分にtypename Dummyがあるのは何ですか?なぜ '...'があるのですか?

誰でも説明できますか?ありがとう!

template<typename Traits> 
class Robot { 

public: 
    template<typename... Dummy, typename U = Traits> 
    typename std::enable_if<std::is_base_of<ResearchTraits, U>::value>::type 
    MyFunction() { 
     static_assert(sizeof...(Dummy) == 0, "Do not specify template arguments!"); 
     std::cout << "research based." << std::endl; 
    } 

    template<typename... Dummy, typename U = Traits> 
    typename std::enable_if<std::is_base_of<ProductionTraits, U>::value>::type 
    MyFunction() { 
     static_assert(sizeof...(Dummy) == 0, "Do not specify template arguments!"); 
     std::cout << "production based." << std::endl; 
    } 
}; 

答えて

2

あなたはstd::enable_ifを見れば、あなたは第二のvoidに不履行、enable_ifは2つのテンプレートパラメータを持っている参照してください。あなたの場合

template< bool B, class T = void > 

Bしたがって、std::is_base_of<ResearchTraits, U>::valueに等しく、Tが省略されていますデフォルトはvoid

同じページから:

Bがtrueの場合、std :: enable_ifにはpublicメンバーのtypedef型があり、Tと等しいのは です。それ以外の場合は、メンバーtypedefはありません。

あなたの戻り値の型は、あなたのケースでvoidある、これTに等しい、std::enable_if<...>::typeです。

+0

これは、使用するメンバー機能を「選択」する通常の方法ですか?またはそのような選択のための専用の構文がありますか? MyFunctionの戻り値の型は常に無効なので、何も選択する必要はありません。 – user152503

+0

これは、 'Robot'のテンプレートパラメータが' ProductionTraits'か 'ResearchTraits'かどうかによって異なる関数オーバーロードを指定する方法です。私はそれが何か他のこともしているのかどうかは完全には分かっていないので、私はその質問をもう少し知識のある人に任せておきます – smead

+0

'Dummy'変数は、ユーザがカスタムテンプレートパラメータでその関数を呼び出し、常に 'Traits'をデフォルトにします。私は 'Traits'を' is_base_of'に直接接続するのではなく、なぜこれが必要なのか考えることはできません – smead

関連する問題