1
if (std::is_same<T, float>::value)
    {
        float a;
        somefunc_float(x,len,&a);
    }

double *上記のコードはテンプレートからのもので、いくつかのプリミティブ データ型 (たとえば、 x は、float *またはint *)のポインターである可能性があるポインター x を受け入れ、li​​bからのものであり、 (上記の例では、somefunc_float1 つの特定のデータ型のみを受け入れることができます。 )、コンパイラは常にエラーを表示し、式がまったく機能しないかのように、入力データ型 (x) が正しくないことを教えてくれますか?xfloat *std::is_same<T, float>::value

4

3 に答える 3

2

問題の説明は完全に明確ではありませんが、あなたがしようとしていることは理解できると思います: コンパイル時に実行できるテストでテンプレート関数内にコードのブロックを囲み、コンパイラがそのブロックを破棄し、コンパイルしないでください。

テンプレートはそのようには機能しません。テンプレートがインスタンス化されると、テンプレート全体がチェックおよびコンパイルされ、オプティマイザーがコードのブロックを破棄する前にコードが正しくなければなりません (この場合はおそらくそうなります)。

その動作を取得するための一般的なアプローチは、異なる型で呼び出されるテンプレート (または非テンプレート オーバーロード) の複数の実装を提供することです。コンパイラは、適切な実装への呼び出しの場所でディスパッチし、残りを無視します。


static ifあなたがやろうとしていることをサポートする、C++ の将来のバージョン (おそらく C++17) の機能に関する提案があります。

于 2013-01-13T23:43:49.310 に答える
2

C++17 になったので、あなたのアプローチは有効になりました。ただし、マイナーな構文修正が必要です。

// is_same_v is an alias for is_same<...>::value
if constexpr (std::is_same_v<T, float>) {  
    float a;
    somefunc_float(x,len,&a);
}

詳細については、if のドキュメントを参照してください。

于 2021-01-09T08:48:20.970 に答える
1

型は静的に決定され、インスタンス化されたすべてのテンプレート コードはコンパイルする必要があります。つまり、意味があります。条件が false であっても、ステートメントの内容はif意味を成さなければなりません。

次のようなことを試してください:

template <typename T> execute_if_float(T) { }

execute_if_float(float x) { somefunc_float(x); }


template <typename T> void myCode(T x)
{
    // ...

    execute_if_float(x);

    // ...
}
于 2013-01-13T23:46:04.693 に答える