web-dev-qa-db-ja.com

特性クラスはどのように機能し、何をしますか?

私はスコット・マイヤーズの Effective C++ を読んでいます。彼は特性クラスについて話しているので、コンパイル時にオブジェクトのタイプを判別するためにそれらが必要であると理解しましたが、これらのクラスが実際に行うことについての彼の説明を理解できませんか? (技術的な観点から)

62
rookie

おそらく、型特性を機能させる何らかの魔法を期待しているでしょう。その場合、失望します。魔法はありません。型特性は、各型に対して手動で定義されます。たとえば、イテレータにtypedef(例:iterator_traits)を提供するvalue_typeを検討してください。

それらを使用して、あなたは書くことができます

iterator_traits<vector<int>::iterator>::value_type x;
iterator_traits<int*>::value_type y;
// `x` and `y` have type int.

しかし、これを機能させるために、実際には明示的な定義<iterator>ヘッダーのどこかにあり、次のようになります。

template <typename T>
struct iterator_traits<T*> {
    typedef T value_type;
    // …
};

これは、iterator_traits形式の型のT*型の部分的な特殊化、つまり汎用型のポインターです。

同じように、iterator_traitsは他のイテレーターに特化しています。 typename vector<T>::iterator

50
Konrad Rudolph

特性クラスはnotオブジェクトのタイプを決定します。代わりに、通常は特性内でtypedefまたは定数を定義することにより、タイプに関する追加情報を提供します。

43
fredoverflow