ホームページ >バックエンド開発 >C++ >「std::enable_if」はどのように機能するか: その実装と使用法の謎を解明する?

「std::enable_if」はどのように機能するか: その実装と使用法の謎を解明する?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 07:52:02752ブラウズ

How Does `std::enable_if` Work: Unraveling the Mysteries of Its Implementation and Usage?

std::enable_if を理解する: その目的と実装を解読する

std::enable_if の性質は特定のコンテキストで把握されていますが、複雑さ、特にテンプレート ステートメント内の 2 番目の引数と 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>

重要なことに、型エイリアスの typedef T 型は、Cond が 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>

ここで、foo の戻り値の型は std::enable_if::is_integer, void>::type で定義されています。 std::numeric_limits::is_integer はブール条件であるため、この戻り値の型は条件が true の場合にのみ定義されます。

2 番目の引数の明確化

表記法内:

<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>

= 0 は、2 番目のテンプレート パラメーターのデフォルトとして使用されます。これにより、std::enable_if パラメータがデフォルトでない場合に 2 つのテンプレート パラメータが必要になるのではなく、foo(1) を使用して両方のオプションを呼び出すことができます。

注目すべき詳細

  • 型名 std::enable_if::type を明示的に入力すると、明確さが向上します。
  • C 14 では、enable_if_t は確立された型であり、戻り値の型を std::enable_if_t に簡略化します。
  • Visual Studio 2013 より前のバージョンでは、戻り値の型のみで enable_if を使用できます。

以上が「std::enable_if」はどのように機能するか: その実装と使用法の謎を解明する?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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