質問

単精度(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>を切り替えようとする場合は、メタプログラミングトリックを使用するか、それぞれに個別のコードパスを用意する必要があります。

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