2009-03-03 11 views
8

単一(float)またはdoubleの精度を使用するようにテンプレート化された一連の関数とクラスがあるとします。もちろん、ブートストラップコードを2つだけ書くことも、マクロを混乱させることもできます。しかし、私は実行時にテンプレート引数を切り替えることはできますか?C++で実行時にテンプレート引数を選択

答えて

19

いいえ、実行時にテンプレート引数を切り替えることはできません。テンプレートはコンパイル時にコンパイラによってインスタンス化されるためです。あなたは両方のテンプレートは、共通の基本クラスから派生し、常にあなたのコード内で基本クラスを使用して、実行時に使用するクラスを派生かを決定しているされて何ができるか:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

マクロは同じ問題を抱えていますコンパイル時に展開されるという点で、

3

テンプレートはコンパイル時のメカニズムです。ところで、マクロも同様です(厳密に言えば - 前処理メカニズム - これはコンパイル前でもあります)。

2

テンプレートはまったくコンパイル時の構造であり、コンパイラはテンプレートを展開し、指定された引数でクラス/関数を作成し、直接コードに変換します。

実行時にfoo<float>foo<double>の間で切り替えようとすると、いくつかのメタプログラミングトリッキーを使用するか、それぞれに別々のコードパスが必要になります。

関連する問題