2017-10-24 13 views
0

私は、テンプレート化された再利用可能なクラス(つまり、すべてのソースコードがヘッダファイルにあります)とドライバファイルのセットからなるC++の 'ライブラリ'を持っています。各ドライバソースファイルには、クラステンプレートを含むヘッダーがいくつか含まれています(必ずしもすべてではありません)。C++とCMake:ファイルからテンプレートクラスを設定する

特定のテンプレートパラメータ(コンパイル時に知られている)を持つ各ドライバファイルでこれらのクラステンプレートをインスタンス化し、設定ファイルを読み込んでインスタンス化されたタイプのオブジェクトの初期化を自動化するといいでしょう。いくつかのボイラープレートコード)。これらの設定ファイルは、オブジェクト構築時に読み込まれます。

設定ファイルがソースコードにバンドルされているとします。ドライバのコンパイル時に、各クラスが設定ファイルを見つけるためにどこに配置する必要がありますか?私はCMakeを使ってコードをビルドしています。

再利用可能なコードはライブラリにコンパイルされないため、ライブラリと同じ場所に設定ファイルを置くことはできません。私はそれが実際に良いアイデアになるかどうかも分からない。

解決策の1つは、設定ファイルを含むフォルダをCMake変数として指定し、この値を設定可能なすべてのクラスのソースコードにハードコードすることです。これを行うより良い方法はありますか?おそらく、問題を処理する標準的なCMakeスタイルの方法がありますか?

+0

この質問を理解する際に問題が発生しています。あなたは実行時の設定ファイルについて話していますか?私。あなたが適切なパーサに供給しているXMLやJSONのようなもの?また、少なくともあなたが本当のC++のテンプレートについて話しているのであれば、珍しい語彙があるようです。すべてのソースコードがヘッダーファイルにある場合、なぜCMakeプロセスが関与していますか?そして、「ドライバソースファイル」は何が必要ですか?これはXYの問題かもしれませんが、私は確かにそれを言うことさえできません。 – MSalters

+0

@MSalters:こんにちは、私はランタイム設定について話しています。各ドライバファイルには独自のmain()が含まれており、非テンプレートコードをコンパイルして得た他の共有ライブラリをリンクするため、すべてのソースコードがヘッダーに含まれているわけではありません。実行時に設定したいクラスのほとんどはテンプレートクラスです(明らかに、設定パラメータはテンプレートパラメータに関係しません)。 私の語彙はとても珍しいですか? –

+0

まあ、ヘッダーには本当に "テンプレートクラス"ではなく "クラステンプレート"が含まれていると仮定します。通常の用語では、これらのテンプレートは_インスタンス化されています。また、「設定」についても言及します。これは_initialization_であってもなくてもかまいませんが、_objects_に適用され、テンプレートクラスのインスタンス化はオブジェクトではなく型です。そして、実行時の設定について明らかに話しているので、設定ファイルの場所は通常、OSのものです(Windowsはレジストリを代わりに使用します)。 – MSalters

答えて

0

私は良い 'olマクロでこれを行うことを検討します。 target_compile_definitions()を使用して、ソースコードにマクロを定義することができます。設定ファイルは、include()がロードされたCMakeファイルそのものになります。次に、ソースファイルで明示的なテンプレートの特殊化またはtypedefをMyTemplateClass<TEMPLATE_ARG_MACRO_1, TEMPLATE_ARG_MACRO_2>に行うことができます。

うまくいけば、それはある意味があります。

関連する問題