コードで中心的な役割を果たす軽量クラスがあります。実際には、2種類あります(たとえば、V0
とV1
)。どちらもメソッドdo_it()
を持っています。この方法は、V0
に約10個の浮動小数点演算(FPO)を、V1
に約20個のFPOを取ります。これは少数ですが、do_it()
が常に呼び出されており、全体としてこれらの呼び出しには実行時間の30%〜70%がかかります。私の現在の実装V0
とV1
でC++:テンプレートに対する代替ソリューション
はdo_it()
の正しいバリアントは、コンパイル時に決定されるので、それらに依存する他のすべてのクラスのテンプレートパラメータです。
問題は、コード内の任意のクラスはV
を使用していますかV
を使用するクラスを使用するため、実際にはすべてのクラスがテンプレートです基本的にです。時間が経つと少し迷惑になり、維持するのが難しくなります。
テンプレートの代わりにC++の他のメカニズムを使用できますか?誰もこのケースのオーバーヘッドを見積もることはできますか?もちろん、私はコードを書き換えるとき、私は、実際の数字を学びますが、これは は私も(非常に単純化された)の例を提供してみましょう、かなりの投資
EDITです:
のは、V0
とV1
がポイントであるとしましょう2D空間でV0
は平面上にあり、球面上にはV1
です。 do_it()
ポイント間及びV0
の場合の距離を算出する方法はV1
よりもはるかに高速であるそれから例えばクラスを持っていますplot_distribution<V>(Points<V>)
等のような解析コードのPoints<V>
への参照を保持std::vector<V>
から継承Points<V>
、RandomWalk<V>
、ロットは、将来のある時点で
多分ユーザは、例えば自分のジオメトリを提供するために許可されますトーラス。しかし、今のところ、2つのジオメトリしか許されておらず、それらは同時に両方のプログラムに現れることはありません。
なぜこれは迷惑ですか?ヘッダーファイルにすべてを入れましたか? –
はい、コードが* .hhの場合は90%です。私はそれが気に入りません。 – tnorgd
メソッド定義をcppファイルに移動し、すべてを明示的にインスタンス化できます。 'someclass'と 'someclass 'という各クラステンプレートに対して2つのインスタンス化だけが必要です。 –