2

C++ では、ランタイム ポリモーフィズムに純粋仮想クラスがよく使用されます。

だからあなたは持っています:

class IInterfaceA
{
    virtual void DoFoo() = 0;
};

そして、次のような派生クラス:

class CFancyObject : public IInterfaceA
{
...

次に、次のような関数で使用できます。

void Foo(IInterfaceA &interface);

ただし、これは実行時のケースであり、コンパイル時にオブジェクトがわかっている場合は、CRTP を使用することでより適切に処理できます。

template<class T> class IInterfaceA
{
public:
    void DoFoo()
    {    
        static_cast<T*>(this)->CallDerivedFunction();
    }
}

class CFancyObject : public IInterfaceA<CFancyObject>
{
    ...
}

IInterface をパラメーターとして受け取る関数で CRTP ベースの派生クラスを使用することは可能ですか?

void Foo(IInterfaceA<?> &interface);
4

2 に答える 2

2

インターフェイスは、クラスの API をその実装から分離することを目的としています。テンプレート パラメーターを導入することで、実装をインターフェイスに密結合させ、目的全体を無効にします。CRTPは、さまざまな問題を解決することを目的としています。

インターフェイスをテンプレート化する場合は、それをパラメーターとして受け取る関数もテンプレート化する必要があります。これが完了すると、インターフェイス クラスを使用する場合と実装クラスを使用する場合に違いはありません。

template<class T>
void Foo(IInterfaceA<T> &interface) { interface.DoFoo(); }

と同一であり、それ以上の利点はありません

template<class T>
void Foo(T &object) { object.DoFoo(); }
于 2012-02-16T17:07:32.810 に答える
0

あなたはただすることができませんでした:

template<class T> class IInterfaceA 
{
public:
    template<class T2>
    void DoFoo(IInterfaceA<T2> &interface)
    {    
        static_cast<T*>(this)->CallDerivedFunction(interface);
    }
}

class CFancyObject : public IInterfaceA<CFancyObject>
{
    template<class T2>
    CallDerivedFunction(IInterfaceA<T2> &interface) {...}
}

于 2012-02-16T19:33:59.317 に答える