同じ問題に対して2つの解決策があります.1つの「コントローラー」から使用されたオブジェクトへのある種のコールバックを作成するため、何を選択すればよいかわかりません。
解決策 1: インターフェイスを使用する
struct AInterface
{
virtual void f() = 0;
};
struct A : public AInterface
{
void f(){std::cout<<"A::f()"<<std::endl;}
};
struct UseAInterface
{
UseAInterface(AInterface* a) : _a(a){}
void f(){_a->f();}
AInterface* _a;
};
解決策 2: テンプレートを使用する
struct A
{
void f(){std::cout<<"A::f()"<<std::endl;}
};
template<class T>
struct UseA
{
UseA(T* a) : _a(a){}
void f(){_a->f();}
T* _a;
};
これは、私の問題を説明するための単純なサンプルです。現実の世界では、インターフェイスにはいくつかの関数があり、1 つのクラスが複数のインターフェイスを実装する場合があります (実装する予定です!)。
コードは外部プロジェクトのライブラリとして使用されず、テンプレートの実装を非表示にする必要はありません。「コントローラー」の実装を非表示にする必要がある場合は、最初のケースの方が適しているためです。
それぞれの場合のメリット・デメリットと、どちらが使いやすいか教えてください。