「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 「std::enable_if」はどのように機能するのか: その実装と使用法の謎を解明する?

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

2024 年 11 月 12 日に公開
ブラウズ:936

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 は、次のように定義された特殊なテンプレートです:

template struct enable_if {};
template struct enable_if { typedef T type; };

重要なことに、型エイリアスの typedef T 型は、Cond が true の場合にのみ定義されます。

使用法の公開

次の宣言を考えてみましょう。

template
typename std::enable_if<:numeric_limits>::is_integer, void>::type foo(const T &bar) { isInt(bar); }

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

2 番目の引数の明確化

表記法:

template::value, int>::type = 0>
void foo(const T& bar) { isInt(); }

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

注目すべき詳細

]
  • 型名 std::enable_if<:condition t>::type を明示的に入力すると拡張されますclarity.
  • C 14 では、enable_if_t は戻り値の型として使用される確立された型であり、std::enable_if_t に簡略化されています。
  • 2013 より前の Visual Studio バージョンの場合、戻り値の型のみenable_if.
を使用できます。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3