C ++で実行時にテンプレート引数を選択
質問
単精度(float
)またはdouble
精度を使用するようにテンプレート化された一連の関数とクラスがあるとします。もちろん、ブートストラップコードを2つだけ記述することも、マクロを台無しにすることもできます。しかし、実行時にテンプレート引数を切り替えることはできますか?
解決
いいえ、テンプレートはコンパイル時にコンパイラによってインスタンス化されるため、実行時にテンプレート引数を切り替えることはできません。行うことができるのは、両方のテンプレートに共通の基本クラスから派生させ、常にコードで基本クラスを使用してから、実行時に使用する派生クラスを決定することです。
class Base
{
...
};
template <typename T>
class Foo : public Base
{
...
};
Base *newBase()
{
if(some condition)
return new Foo<float>();
else
return new Foo<double>();
}
マクロには、コンパイル時に展開されるという点で、テンプレートと同じ問題があります。
他のヒント
テンプレートはコンパイル時のメカニズムです。ところで、マクロも同様です(厳密に言えば-プリプロセスメカニズム-コンパイル前でもあります)。
テンプレートは純粋にコンパイル時の構造であり、コンパイラはテンプレートを展開し、指定された引数でクラス/関数を作成し、それをコードに直接変換します。
実行時にfoo<float>
とfoo<double>
を切り替えようとする場合は、メタプログラミングトリックを使用するか、それぞれに個別のコードパスを用意する必要があります。
所属していません StackOverflow