std::add_const などの使用例 質問する

std::add_const などの使用例 質問する

における一部の型変換は、<type_traits>コア言語構文を使用して表現することもできます (例:std::add_const<T>::typeは と同等である/同等であるように見えるconst T)。std::add_lvalue_reference、およびおそらく他のものについても Dtto が当てはまります。これらの型特性の用途は何ですか?

これらがなければ標準では「不完全なツールボックス」が提供されることになるだろうことは十分理解しており、次のようなメタな方法での使用を想像できます。

template<typename In, template <typename> class Modifier>
struct Apply {
  typedef typename Modifier<T>::type Out;
};

Apply<int, std::add_const>

これらの特性には、構文的に表現できる他の使用例がありますか、それとも「完全性のため」や時折のメタ使用のために単に含まれているのでしょうか?

ベストアンサー1

これらの特性はBoostとそれを標準に追加する提案から来ています。N1345は、アンドレイ・アレクサンドルスクの言葉を引用している。

add_const「 、、、およびを追加することの対称性の議論は理解できますが、私はそれらを削除することを支持します。言語が提供する同等のものの方がシンプルで優れています。add_volatileadd_cvadd_pointer

同じ提案では、次のような根拠も示されています。

著者注: 表面的にはadd_const、add_volatile、add_cvクラスは無関係です。たとえば、add_const::typeはすべてのTに対してT constと同じです(現在、これは関数型には適用されませんが、295号この問題に対処しています。ただし、boost の経験では、次の理由から、複数のユーザーがこれらのテンプレートをライブラリに含めるよう求めています。(a) 一部のユーザーは、これらがより明示的であると考えています。特に、変換テンプレートを組み合わせる場合、ユーザーはこれらのテンプレートが提供する「組み込みドキュメント」のようなものを好みます。(b) 参照を cv 修飾することは許可されていても効果がないということ、またはすでに cv 修飾されている型を cv 修飾することは許可されていても効果がないということを、すべてのユーザーが認識しているわけではありません。(c) 参照である型、またはすでに cv 修飾子を持つ型を cv 修飾すると、コンパイラーが警告を発行することがあり、これらのテンプレートは、これらの場合にこれらのメッセージを抑制するように実装できます。

また、add_referenceadd_lvalue_reference標準では に名前が変更されています)の場合:

著者注: add_reference テンプレートは、boost 型特性ライブラリの元々の動機の 1 つでした。しかし、106号テンプレートが大部分冗長に見えます。それにもかかわらず、add_reference は、テンプレート コード内で参照への参照を誤って作成した場合にコンパイラの警告を抑制するのに役立つ可能性があります。

おすすめ記事