戻り値の型とテンプレート パラメーターにおける SFINAE の適用性
C プログラミングにおける SFINAE (Substitution Failure Is Not An Error) は、テンプレートのメタプログラミング。 SFINAE を使用すると、テンプレート パラメーターを使用して、テンプレート関数またはクラスに渡すことができる引数の型に対する制約を指定できます。
この例では、foo という名前の関数の実装が 2 つあります。
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;
最初の実装では、テンプレート パラメーターで std::enable_if メタ関数を含む SFINAE を使用します。これは、テンプレート関数 foo は、条件 std::is_integral
ただし、2 番目の実装では、戻り値に std::enable_if を含む SFINAE が使用されます。テンプレート関数のタイプ。この場合、関数 foo は任意の型で呼び出すことができますが、戻り値の型は、T が条件 std::is_integral
この例では、最初の実装は、テンプレートが最初のテンプレート パラメーターに対してすでにインスタンス化されているかどうかを判断するときに、2 番目のテンプレート パラメーターのデフォルトのテンプレート引数が考慮されないため、コンパイルに失敗します。したがって、コンパイラは、同じ関数テンプレートを 2 回再宣言しようとしてエラーが発生すると想定します。
一方、2 番目の実装は、式 typename std::enable_if<:is_integral t>::value>::type は、テンプレートのインスタンス化中に評価され、関数の戻り値の型として使用されます。この式はテンプレート関数のシグネチャの一部であるため、SFINAE は T の値に基づいてさまざまなテンプレートの特殊化を区別できます。
以上がSFINAE を戻り値の型に適用した場合とテンプレート パラメーターに適用した場合の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。