2

adanve に関する注意: C++11 も受け入れられますが、C++99 が推奨されます。仮想関数については回答しないでください。テンプレートのみでお願いします!

私がモデル化したいのは、典型的な「A と B は C を意味する」状況です。私はいくつかの C++ クラスと、それらのプロパティを記述したいくつかのテンプレートを持っています。例:

template<typename S, typename T, typename U>
class Base
{
    MaybeTruePropertyA<S,T> a;
    MaybeTruePropertyB<S,T,U> b;
    MaybeTruePropertyC<S,T,U> c;
};

私がこのように継承するとしましょう:

template<typename S, typename T, typename U>
class Inherited : public Base<S,T,U>
{
    TruePropertyA<S,T> a;
    TruePropertyB<S,T, U> b;
};

次に、魔法のようにinに設定PropertyCしたいと思います。さて、ここに私の問題があります:TruePropertyInherited

  1. これを魔法のように行う方法がわかりません。
  2. MaybeTruePropertyAまた、 Inheritedに隠すのはメモリの無駄だと思います。

上記のようなプロパティを使用して「AとBがCを意味する」を行う方法を誰かが解決できますか? 一部を変更することはできますが、プロパティは引き続き のように表示する必要がありますTrueProperty<S,T> a

あまり抽象的ではない例がここにあります: http://pastebin.com/M209CJp4

4

1 に答える 1

2

これは、貼り付けビンのコードに実際には従いません。質問のおもちゃのコードの例にも実際には従っていません。しかし、あなたが求めているのは、プロパティ テンプレートへのパラメーターに基づくテンプレートの特殊化です。以下は、これを実現する方法の例です。

template <int S, int T> struct PropertyA { enum { V = false }; };
template <int S, int T, int U> struct PropertyB { enum { V = false }; };

アイデアは、デフォルトでPropertyAPropertyBfalseプロパティであるということです。それらはtrue、後で説明する専門化によって作成されます。

template <bool A, bool B>
struct PropertyC {
    void doSomething () { std::cout << "False" << std::endl; }
};

template <> struct PropertyC<true, true> {
    void doSomething () { std::cout << "True" << std::endl; }
};

ここでは、両方のパラメーターが でない限りPropertyC、プロパティとして動作します。これは専門化によって達成されました。falsetrue

template <int S, int T, int U>
struct MaybeTruePropertyC {
    void doSomething () {
        PropertyC<PropertyA<S, T>::V, PropertyB<S, T, U>::V>().doSomething();
    }
};

現在、はおよびでMaybeTruePropertyC使用される値によってパラメータ化され、それらの値が に供給されて、目的の動作が得られます。PropertyAPropertyBPropertyC

したがって、クラスを使用するには、 と の特殊化を定義しPropertyAますPropertyB

template <> struct PropertyA<1, 2> { enum { V = true }; };
template <> struct PropertyB<1, 2, 3> { enum { V = true }; };

そして、次のように使用できるようになりました。

MaybeTruePropertyC<1, 2, 3> c;
c.doSomething();

リンクをたどると、コードの動作を確認できます。

于 2012-09-18T21:09:08.383 に答える