2017-11-25 8 views
0

以下のように書くために、よりクリーンな方法(重複の少ないコードを意味する)はありませんか?"Enable_if"構造体menber

template < bool condition > 
class Test { 

    struct Foo1 { 

    int a; 
    }; 

    struct Foo2 { 

    int a; 
    int b; 
    }; 

    using type = std::conditional_t<condition, Foo1, Foo2>; 
}; 

私がここでやりたいことは、構造体の単一のデータメンバーを有効または無効にすることです。だから、もし私が一つの構造体しか必要としないなら、それはいいだろう。

のような何か:

template < bool condition > 
class Test { 

    struct type { 
    int a; 
    if constexpr(condition) 
     int b; 
    }; 
}; 
+2

継承はどうですか? 'Foo2'を' Foo1'から継承させますか?それは少なくとも「重複コードの削減」を意味します。これは、オブジェクト指向言語で構造とクラスを拡張する "自然な"方法です。 –

+0

@Someprogrammerdudeはい、それはコードが少なくなるだろうが、それは私が望んでいたものではありません。私はより多くの文脈を追加する必要があると思う。 –

+0

@MathieuVanNevel:それはなぜあなたがそれを望んでいるのかを説明していないので、それは本当に「より多くのコンテキスト」ではありません。そして、あなたはそれをどのように使う予定ですか? –

答えて

1

これはあなたのために、「クリーン」である場合、私は知らないが、...あなたは、このように自動継承(の一種)クラスFooを書くことができます(

// common part 
template <bool> 
struct Foo 
{ int a; }; 

// only when `Cond` is true 
template <> 
struct Foo<true> : public Foo<false> 
{ int b; }; 

Test

template <bool Cond> 
struct Test 
{ using type = Foo<Cond>; }; 
になる)残念ながら、行うことができますが、外

以下は完全なコンパイル例です

template <bool> 
struct Foo 
{ int a; }; 

template <> 
struct Foo<true> : public Foo<false> 
{ int b; }; 

template <bool Cond> 
struct Test 
{ using type = Foo<Cond>; }; 

int main() 
{ 
    decltype(Test<true>::type::a) a1; 
    decltype(Test<true>::type::b) b1; 
    decltype(Test<false>::type::a) a0; 
    // decltype(Test<false>::type::b) b0; // compilation error 
} 
+0

努力をいただきありがとうございますが、私が書いた擬似コードからはまだまだ遠いです。とにかくおそらく不可能ですが、ちょっと待っています。 –

+0

@MathieuVanNevel - 残念ながら、データメンバーではなく単にメソッドを有効/無効にする方法を知っています。 – max66