2012-08-24 8 views
17

次のコードを考えてみましょう。このコードでテンプレートパラメータを使用してデータメンバーを追加/削除しますか?

template<bool AddMembers> class MyClass 
{ 
    public: 
     void myFunction(); 
     template<class = typename std::enable_if<AddMembers>::type> void addedFunction(); 

    protected: 
     double myVariable; 
     /* SOMETHING */ addedVariable; 
}; 

を、テンプレートパラメータAddMembersは、それがtrueだときに、クラスに機能を追加することができます。これを行うには、std::enable_ifを使用します。

私の質問は次のとおりです:データメンバ変数の同じ可能(おそらくトリック)ですか? ?(MyClass<false> 1つのデータメンバ(myVariable)を有するであろうとMyClass<true> 2人のデータメンバー(myVariableaddedVariable)を有するよう

答えて

21

に条件基本クラスを使用することができる。

struct BaseWithVariable { int addedVariable; }; 
struct BaseWithoutVariable { }; 

template <bool AddMembers> class MyClass 
    : std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type 
{ 
    // etc. 
}; 
16

まずオフ、あなたのコードは、ちょうどMyClass<false>のためにコンパイルされませんenable_if形質が推測引数のではなく、クラスのテンプレート引数に便利です

第二に、ここであなたはメンバーを制御できる方法は次のとおりです。。

template <bool> struct Members { }; 

template <> struct Members<true> { int x; }; 

template <bool B> struct Foo : Members<B> 
{ 
    double y; 
}; 
+0

+++++完璧!条件付きテンプレートパラメータを持つMixin – Viet

関連する問題