ホームページ >バックエンド開発 >C++ >SFINAE を戻り値の型に適用した場合とテンプレート パラメーターに適用した場合の違いは何ですか?

SFINAE を戻り値の型に適用した場合とテンプレート パラメーターに適用した場合の違いは何ですか?

DDD
DDDオリジナル
2024-12-19 12:44:11839ブラウズ

How Does SFINAE Differ When Applied to Return Types Versus Template Parameters?

戻り値の型とテンプレート パラメーターにおける 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::value を満たす型でのみ呼び出すことができることを意味します。

ただし、2 番目の実装では、戻り値に std::enable_if を含む SFINAE が使用されます。テンプレート関数のタイプ。この場合、関数 foo は任意の型で呼び出すことができますが、戻り値の型は、T が条件 std::is_integral::value を満たす場合にのみ void 型になります。

この例では、最初の実装は、テンプレートが最初のテンプレート パラメーターに対してすでにインスタンス化されているかどうかを判断するときに、2 番目のテンプレート パラメーターのデフォルトのテンプレート引数が考慮されないため、コンパイルに失敗します。したがって、コンパイラは、同じ関数テンプレートを 2 回再宣言しようとしてエラーが発生すると想定します。

一方、2 番目の実装は、式 typename std::enable_if<:is_integral t>::value>::type は、テンプレートのインスタンス化中に評価され、関数の戻り値の型として使用されます。この式はテンプレート関数のシグネチャの一部であるため、SFINAE は T の値に基づいてさまざまなテンプレートの特殊化を区別できます。

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

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