ホームページ >バックエンド開発 >C++ >C の SFINAE : テンプレート パラメーターと戻り値の型 – 違いは何ですか?

C の SFINAE : テンプレート パラメーターと戻り値の型 – 違いは何ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-14 05:53:171006ブラウズ

SFINAE in C  : Template Parameter vs. Return Type – What's the Difference?

戻り値の型とテンプレート パラメーターの SFINAE: 比較

C では、置換失敗はエラーではありません (SFINAE) イディオムは条件付きを許可しますタイプの可用性に基づいてコンパイルします。ただし、テンプレート内の異なる位置に配置すると、その動作が異なる場合があります。

テンプレート パラメーターの SFINAE

以下のコードでは、SFINAE がテンプレート パラメーターとして使用され、特定のテンプレート関数のオーバーロードを有効または無効にします。

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void { /* ... */ }

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void { /* ... */ }

この場合、SFINAE は 2 番目のテンプレートに適用されます。テンプレート パラメータ。これは事実上プレースホルダです。 foo(3.4) を呼び出そうとするとエラーが発生します。これは、std::enable_if::value> を使用した 2 番目のテンプレート関数宣言が原因です。が定義されていないため、オーバーロードが欠落します。

戻り値の型に SFINAE

対照的に、次のコードは戻り値の型に SFINAE を使用しています:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { /* ... */ }

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { /* ... */ }

この場合、SFINAE が戻り値の型に適用され、コンパイラが 2 つのテンプレート関数を区別できるようになります。

違いは何ですか?

動作の違いは、デフォルトのテンプレート引数の使用に起因します。最初の例では、2 番目のテンプレート パラメーターはデフォルトで typename std::enable_if::value>::type に設定されており、テンプレート関数の宣言は同等になります。

2 番目の例では、戻り値の型が式内で SFINAE を使用します。これは関数シグネチャの一部です。これにより、テンプレート関数が異なるシグネチャを持つことが保証され、SFINAE が期待どおりに動作できるようになります。

以上がC の SFINAE : テンプレート パラメーターと戻り値の型 – 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。