特质班如何运作?

时间:2010-10-20 15:50:49

标签: c++ traits

我正在阅读Scott Meyers的Effective C++。他正在谈论traits类,我知道我需要它们来确定编译期间对象的类型,但我无法理解他对这些类实际做什么的解释? (从技术角度来看)

2 个答案:

答案 0 :(得分:49)

也许你期待某种能使类型特征发挥作用的魔法。在那种情况下,失望 - 没有魔力。类型特征是为每种类型定义的手动。例如,考虑iterator_traits,它为迭代器提供typedef(例如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

答案 1 :(得分:42)

Traits类确定对象的类型。相反,它们提供有关类型的其他信息,通常通过在特征中定义typedef或常量。