ホームページ >バックエンド開発 >C++ >C テンプレートに std::enable_if への一見無意味な割り当てがあるのはなぜですか?

C テンプレートに std::enable_if への一見無意味な割り当てがあるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 10:49:02805ブラウズ

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

std::enable_if の内部動作を理解する

最近の質問で、条件付き戻り値の型としての 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(1); で呼び出すことができます。デフォルトを設定しないと、foo を呼び出すには、int だけではなく 2 つのテンプレート パラメーターが必要になります。

理解の進化

C 14 では、std::enable_if_t 型が導入され、これは typedef フォームの代わりに使用する必要があります。これにより、戻り値の型がより簡潔になります:

std::enable_if_t<:numeric_limits>::is_integer></:numeric_limits>

以上がC テンプレートに std::enable_if への一見無意味な割り当てがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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