最近の質問で、条件付き戻り値の型としての std::enable_if の使用法について説明しました。最初の使用法は明らかでしたが、std::enable_if への一見無意味な代入を含む 2 番目の使用法は不可解なままでした。
概念のロックを解除する
謎を解明するにはstd::enable_if:
template<bool cond class t="void"> struct enable_if {}; template<class t> struct enable_if<true t> { typedef T type; };</true></class></bool>
の定義を詳しく調べる必要があります。重要なのは、typedef T 型が bool Cond が true の場合にのみ定義されるという事実にあります。
例への適用
これを理解した上で、コードをもう一度見てみましょう。
template<typename t> typename std::enable_if<:numeric_limits>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</:numeric_limits></typename>
ここでは、std::enable_if を使用して foo 関数の戻り値の型を定義します。 。 T が整数の場合、戻り値の型は void になります。それ以外の場合、関数はコンパイルされません。
デフォルトの役割
2 番目の例では:
template<typename t typename std::enable_if>::value, int>::type = 0> void foo(const T& bar) { isInt(); }</typename>
= 0 のデフォルト パラメーターにより、どちらのオプションも foo
理解の進化
C 14 では、std::enable_if_t 型が導入され、これは typedef フォームの代わりに使用する必要があります。これにより、戻り値の型がより簡潔になります:
std::enable_if_t<:numeric_limits>::is_integer></:numeric_limits>
以上がC テンプレートに std::enable_if への一見無意味な割り当てがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。