戻り値の型とテンプレート パラメーターの 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
戻り値の型に 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
2 番目の例では、戻り値の型が式内で SFINAE を使用します。これは関数シグネチャの一部です。これにより、テンプレート関数が異なるシグネチャを持つことが保証され、SFINAE が期待どおりに動作できるようになります。
以上がC の SFINAE : テンプレート パラメーターと戻り値の型 – 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。