特质班如何运作?

roo*_*kie 63 c++ traits

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

Kon*_*lph 51

也许你期待某种使类型特征发挥作用的魔法.在那种情况下,失望 - 没有魔力.为每种类型手动定义类型特征.例如,考虑一下iterator_traits,它value_type为迭代器提供了typedef(例如).

使用它们,你可以写

iterator_traits<vector<int>::iterator>::value_type x;
iterator_traits<int*>::value_type y;
// `x` and `y` have type int.
Run Code Online (Sandbox Code Playgroud)

但为了使这个工作,在标题中的某个地方实际上有一个明确的定义<iterator>,其内容如下:

template <typename T>
struct iterator_traits<T*> {
    typedef T value_type;
    // …
};
Run Code Online (Sandbox Code Playgroud)

这是一个部分特的的iterator_traits类型为类型形式的T*,一些一般类型的,即指针.

同样,iterator_traits它专门用于其他迭代器,例如typename vector<T>::iterator.

  • +1没有魔法.即使不存在某些特征(例如在C++ 0x标准库中),这些特征不能仅使用该语言可靠地定义,并且需要编译器提供特殊的"神奇"帮助才能工作? (5认同)
  • @Wolf C++ 11添加了一些无法在用户端实现的特性,它们需要编译器支持.并且,是的,`std :: underlying_type`就是其中之一. (4认同)
  • 不是*now*在[`std :: underlying_type`](http://en.cppreference.com/w/cpp/types/underlying_type)中有效吗? (2认同)

fre*_*low 44

性状类并没有确定对象的类型.相反,它们通常通过在特征内定义typedef或常量来提供有关类型的其他信息.

  • +1有效地结合了理论和实施. (5认同)