ライブラリのシンボルをエクスポートするための再帰的な明示的なテンプレートのインスタンス化
-
29-10-2019 - |
質問
私の前の質問で私は尋ねました 再帰的な明示的なテンプレートのインスタンス化が可能です. 。私はそれが本当に可能であることを見ました。ただし、このインスタンス化はローカルでのみ効果的であることが判明し、再帰的にインスタンス化されたテンプレートのシンボルはオブジェクトファイルにエクスポートされないため、(共有)ライブラリに表示されません。だから私は私の前の投稿のようにここでもっと正確に質問します:
のようなテンプレートが与えられます
template<int dim> class Point { ... };
このテンプレートは、明示的にインスタンス化できます
template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
のシンボルをエクスポートします Point<0>
, ..., Point<3>
現在の翻訳ユニットのオブジェクトファイルに。上記のように個別にすべてのテンプレートをインスタンス化する代わりに、1回の呼び出しで再帰的にインスタンス化したいと思います。
これを達成するソリューションは、テンプレートのメタプログラミングのスタイルであれ、ヘルパークラスを介して問題ありません。
template class RecursiveInstantiate<Point, 3>;
またはプリプロセッサを介して。ここでは、ブーストプリプロセッサライブラリを調べました。これには、ループコンストラクトがあるようです。ただし、ブーストプリプロセッサライブラリを使用したことはありません(アドバイスは高く評価されています)が、一見したところ、ループを明示的なテンプレートのインスタンス化と一緒に使用できる場合は懐疑的です。
どんなアドバイスでも、私が達成したいことが不可能な理由も高く評価されています。
実際、私はこれを複数のテンプレートパラメーターを持つクラスに一般化することに興味がありますNode<int i1,int i2,int i3>
{0,1,2,3}のI1、I2、I3のすべての組み合わせについて。しかし、私はこの2番目の部分を自分で解決できることを望んでいます。いつものように、明示的なインスタンス化を使用して、1つの翻訳ユニットのテンプレートのみを定義することでコンパイル時間を高速化するため、オブジェクトファイルにエクスポートするテンプレートのメソッドが必要です。
コンパイラに依存しないソリューションを期待していますが、それが不可能な場合は、G ++/Clangを使用したLinuxに必要です。
私が得たソリューションの調査と、私がこれから作った最終的な解決策については、以下を参照してください。
正しい解決策はありません