2016-07-08 14 views
0

コードで中心的な役割を果たす軽量クラスがあります。実際には、2種類あります(たとえば、V0V1)。どちらもメソッドdo_it()を持っています。この方法は、V0に約10個の浮動小数点演算(FPO)を、V1に約20個のFPOを取ります。これは少数ですが、do_it()が常に呼び出されており、全体としてこれらの呼び出しには実行時間の30%〜70%がかかります。私の現在の実装V0V1C++:テンプレートに対する代替ソリューション

do_it()の正しいバリアントは、コンパイル時に決定されるので、それらに依存する他のすべてのクラスのテンプレートパラメータです。

問題は、コード内の任意のクラスはVを使用していますかVを使用するクラスを使用するため、実際にはすべてのクラスがテンプレートです基本的にです。時間が経つと少し迷惑になり、維持するのが難しくなります。

テンプレートの代わりにC++の他のメカニズムを使用できますか?誰もこのケースのオーバーヘッドを見積もることはできますか?もちろん、私はコードを書き換えるとき、私は、実際の数字を学びますが、これは は私も(非常に単純化された)の例を提供してみましょう、かなりの投資

EDITです:

のは、V0V1がポイントであるとしましょう2D空間でV0は平面上にあり、球面上にはV1です。 do_it()ポイント間及びV0の場合の距離を算出する方法はV1

よりもはるかに高速であるそれから例えばクラスを持っていますplot_distribution<V>(Points<V>)等のような解析コードのPoints<V>への参照を保持std::vector<V>から継承Points<V>RandomWalk<V>、ロットは、将来のある時点で

多分ユーザは、例えば自分のジオメトリを提供するために許可されますトーラス。しかし、今のところ、2つのジオメトリしか許されておらず、それらは同時に両方のプログラムに現れることはありません。

+0

なぜこれは迷惑ですか?ヘッダーファイルにすべてを入れましたか? –

+0

はい、コードが* .hhの場合は90%です。私はそれが気に入りません。 – tnorgd

+2

メソッド定義をcppファイルに移動し、すべてを明示的にインスタンス化できます。 'someclass 'と 'someclass 'という各クラステンプレートに対して2つのインスタンス化だけが必要です。 –

答えて

3

良い古いマクロはまだ完全に使用可能です。

#define NS NS_ ## VARIANT; 

namespace NS 
{ 
    using Variant = VARIANT; 

    class Foo 
    { 
    Variant* v; 
    // etc 
    }; 
    // everything goes here 

} 

は、今一度、一度-DVARIANT = V1と-DVARIANT = V0、と、二回プロジェクト全体をコンパイルします。オーバーヘッドはありません!

+0

私は* old * ...に同意します:-) – skypjack

0

あなたのテンプレートパラメータは、あなたが通常通りた.cppファイルにすべてのテンプレートのコードを移動し、次のようにリンクするために得ることができ、特定のクラス(V0V1言う)に制限されることがわかっている場合...

ヘッダー(.H)

template<class T> 
class Foo 
{ 
public: 
    void Do(); 
}; 

実装(.CPP)

template<class T> 
void Foo::Do() 
{ 
    ///do stuff... 
} 

//this creates two entries in the object code for link time resolution of Foo<V0> and Foo<V1> but Foo<anything else> will fail to link 
template class Foo<V0>; 
template class Foo<V1>; 
関連する問題