11

このテンプレートが与えられた場合:

template <class A>
struct Something {
    ... // members common to all template instantiations for all A types 
    SpecialType member; // but not this - I want this to be conditional...
}

...「enable_if」を使用して、SpecialTypeメンバーを条件付きで存在させたい。つまり、テンプレートがA=SpecialCase1またはSpecialCase2タイプでインスタンス化されている場合のみです。他のすべての場合、SpecialTypeメンバーが欠落していることを望みます。

理由がわからない場合は、これは最適化に関するものです。つまり、構造体で無駄なペイロードを運ばないということです。私はテンプレートメタプログラミングの初心者ですが、どういうわけか「enable_if」と2つの「is_same」が必要であることを理解しています。

編集:一般的なC ++で(つまり、Boost固有のものなしで)それを行うことはプラスになります。

4

4 に答える 4

5

これにはenable_ifは必要ありません。構造体を特殊なケースに特化し、残りはデフォルトの実装のままにします。

template <class A>
struct Something
{
  // your default implementation
};

template <>
struct Something<SpecialCase1>
{
  // your SpecialCase1 implementation
};

template <>
struct Something<SpecialCase2>
{
  // your SpecialCase2 implementation
};
于 2012-04-13T11:56:58.587 に答える
5

ええと:基本クラスを使用してください。

struct Empty {};

struct SpecialTypeCnt { SpecialType member; };

template <typename A>
struct Something: if_< /* cond */ , SpecialTypeCnt, Empty>::type {
};

ここif_で、次のように定義されます。

template <typename, typename, typename E> struct if_ { typedef E type; };

template <typename T, typename E>
struct if_<std::true_type, T, E> { typedef T type; };

(ブール値に特化することもできます)

もちろん、あなたは自分の状態を適切に表現する必要があります。


そうは言っても、おそらく単にを使用するべきではありませんstruct。代わりに、classに適用する必要のある操作を提供するを使用する必要がありますmember。次にclass Null、にデフォルトの動作を提供し、class SomeTypeに固有の動作を提供しますmember

そうしないと、「おそらく」変更する必要があるすべての場所で条件を書き直すことmemberになり、すぐに煩わしくなります。

于 2012-04-13T11:57:30.170 に答える
2

共通のメンバーを複製しないために:

BaseSomethingクラスを定義します。

 template <class A>
        struct BaseSomething {
            ... // members common to all template instantiations for all A types 
                };

SpecialSomethingクラスを定義します。

template <class A>
            struct SpecialSomething {
                SpecialType member;
                ...//SpetialType related functionality
                    };

何かクラスを定義する:

template <class A>
            struct Something :public BaseSomething<A>{

                    };



  template<>
    struct Something<SpecialCase1>:public BaseSomething<A>{
                    SpecialSomething<SpecialCase1> special;
                        };


template<>
struct Something<SpecialCase2>:public BaseSomething<A>{
                SpecialSomething<SpecialCase2> special;
                    };
于 2012-04-13T12:18:03.140 に答える