2010-10-20 36 views
56

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

回答

45

也许你正在期待某种使类型特征起作用的魔法。在这种情况下,要失望 - 没有魔法。类型特征为手动为每种类型定义。例如,考虑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

+4

+1没有魔法。尽管不存在一些特性(例如在C++ 0x标准库中),这些特性不能仅使用语言进行可靠定义,并且编译器需要特殊的“神奇”帮助才能工作? – UncleBens 2010-10-20 19:48:54

+0

@UncleBens:我不知道C++ 0x定义了哪些特征,但我确信在C++ 0x之前不存在这样的特征。 – 2010-10-20 21:41:02

+2

是不是*现在* ['std :: underlying_type'](http://en.cppreference.com/w/cpp/types/underlying_type)中有一种魔法? – Wolf 2014-06-30 08:50:29

38

性状类做不是确定对象的类型。相反,它们通常通过在trait中定义typedef或常量来提供关于类型的其他信息。

+5

+1有效结合理论和实施。 – 2013-04-23 07:27:35