2016-11-25 5 views
0

私はC++で静的ライブラリ(.lib)にパッケージ化されたクラスフレームワークを作成しています。そのライブラリーでは、私は、このような何かをテンプレートクラスFooを持っている:C++で "カスタム"クラスを動的にインスタンス化する方法はありますか?

template <class T> class Foo { 
    <T> data; 
} 

フレームワークは、ファイルから読み込まれたテンプレートタイプでFooのオブジェクトを作成します。理論的にはこのようになります。その:

int 
int 
float 
double 

ので、フレームワークは、テキストファイルをロードし、それがテンプレートタイプintintfloatdoubleで、クラスにFoo 4回をインスタンス化することをに基づいでしょう。

これまでのところうまくいきます。複雑な部分へ:クライアントアプリケーション(.libのフレームワークを使用)は、Fooからカスタムクラスを派生させることができます。それをBarとしましょう。

int 
int 
Bar 

フレームワークは2つのFoo<int>オブジェクト、およびBarの1つのインスタンスを作成する必要があることを意味します:今、私はこのような設定テキストファイルでそのカスタムクラスを許可する必要があります。 C++で可能なことはありますか?そのため、フレームワークはクライアントアプリケーションが定義するクラスを動的にインスタンス化します。

これが不可能な場合は、C++でこれに適した解決策は何でしょうか?

+1

これは、ある種の工場のユースケースです。クライアントは、インスタンスを作成するためにコールバックを提供する必要があります – StoryTeller

答えて

1

テンプレートパラメータTに可能なタイプの固定セットがあるとします(たとえば、intfloat、およびdouble)。

は、次に、あなたのフレームワークのAPIで、次のような機能を持つことができます:

今のところ、Fooオブジェクトへのポインタを作成する関数を渡し、registerFactory機能の一つ以上を呼び出すことができ、クライアントアプリケーション例

フレームワークには、std::functionオブジェクトが格納されます。 std::vector(各テンプレートパラメータタイプに1つ)で指定します。 一部のinit()関数(フレームワークAPIの一部でもあります)では、フレームワークは設定ファイルを通過し、以前と同じようにFoo<>オブジェクトを作成し、登録されたファクトリ関数を呼び出して呼び出します。

+0

テンプレートクラスである必要はなく、CRTPを使用して何かを達成することもできます。それにかかわらず、あなたは実際の答えを提示しません。 – StoryTeller

+0

申し訳ありませんが、私の要求にどう対応するのか分かりません。 「あなたはBのファイルを上記のファイルからインスタンス化できますか? – Matthias

+0

申し訳ありませんが、私は最初にあなたの要件を理解していないようです。 – jbab

関連する問題