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