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

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

Linda Hamilton
リリース: 2024-11-06 10:49:02
オリジナル
689 人が閲覧しました

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; };
ログイン後にコピー

の定義を詳しく調べる必要があります。重要なのは、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(1); で呼び出すことができます。デフォルトを設定しないと、foo を呼び出すには、int だけではなく 2 つのテンプレート パラメーターが必要になります。

理解の進化

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

std::enable_if_t<std::numeric_limits<T>::is_integer>
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート