ホームページ >バックエンド開発 >C++ >`std::enable_if` は関数の戻り値の型を条件付きで定義し、関数の解決を有効にするのにどのように役立ちますか?

`std::enable_if` は関数の戻り値の型を条件付きで定義し、関数の解決を有効にするのにどのように役立ちますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 19:57:01513ブラウズ

How does `std::enable_if` help conditionally define function return types and enable function resolution?

std::enable_if が条件付き関数の解決を容易にする方法

置換の失敗がエラーではないことを理解することは、std::enable_if を理解するために重要です。 std::enable_if は次のように定義された特殊なテンプレートです:

<code class="cpp">template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };</code>

重要なのは、型は条件が true の場合にのみ定義されるということです。

次の関数を考えてみましょう:

<code class="cpp">template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</code>

std::enable_if は関数の戻り値の型を条件付きで定義するために使用され、条件が false の場合はコンパイル エラーが発生します。

コード スニペット内:

<code class="cpp">template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }</code>

2 番目のテンプレート パラメーターのデフォルト値 (0) は、呼び出し foo(1); を有効にするためだけに提供されています。これがないと、関数には 1 つではなく 2 つのテンプレート パラメーターが必要になります。

注: C 14 では、enable_if_t は定義された型であり、わかりやすくするために使用する必要があります。したがって、戻り値の型は std::enable_if_t::is_integer> に圧縮できます。 Visual Studio の古いバージョンでは、既定のテンプレート パラメーターがサポートされていないため、「条件としての std::numeric_limits」の例に示すように、 std::enable_if は関数の戻り値でのみ使用できます。

以上が`std::enable_if` は関数の戻り値の型を条件付きで定義し、関数の解決を有効にするのにどのように役立ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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