私はスコット・マイヤーズの Effective C++ を読んでいます。彼は特性クラスについて話しているので、コンパイル時にオブジェクトのタイプを判別するためにそれらが必要であると理解しましたが、これらのクラスが実際に行うことについての彼の説明を理解できませんか? (技術的な観点から)
おそらく、型特性を機能させる何らかの魔法を期待しているでしょう。その場合、失望します。魔法はありません。型特性は、各型に対して手動で定義されます。たとえば、イテレータに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
。
特性クラスはnotオブジェクトのタイプを決定します。代わりに、通常は特性内でtypedefまたは定数を定義することにより、タイプに関する追加情報を提供します。