ライブラリのシンボルをエクスポートするための再帰的な明示的なテンプレートのインスタンス化

StackOverflow https://stackoverflow.com/questions/7398964

質問

私の前の質問で私は尋ねました 再帰的な明示的なテンプレートのインスタンス化が可能です. 。私はそれが本当に可能であることを見ました。ただし、このインスタンス化はローカルでのみ効果的であることが判明し、再帰的にインスタンス化されたテンプレートのシンボルはオブジェクトファイルにエクスポートされないため、(共有)ライブラリに表示されません。だから私は私の前の投稿のようにここでもっと正確に質問します:

のようなテンプレートが与えられます

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に必要です。


私が得たソリューションの調査と、私がこれから作った最終的な解決策については、以下を参照してください。

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top