特质类是什么以及它们的作用是什么?

71

我正在阅读Scott Meyers的Effective C++。他在谈论特性类,我明白我需要它们来在编译时确定对象的类型,但是我无法理解他关于这些类实际上是做什么的解释?(从技术角度)

他所说的特性类是一种元编程技术,用于获取程序中各种类型的特征信息。通过定义不同的特性类,我们可以让编译器了解到有关某个类型的信息,例如它是否具有默认构造函数、是否可拷贝等等。这种技术的好处是可以在编译期间发现一些潜在的问题,而不必等到运行时才发现。

2个回答

57
也许您期望有某种可以使类型特征起作用的神奇魔法。但事实并非如此,每种类型的类型特征都需要 手动 定义。例如,考虑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;
    // …
};

这是针对形如T*的通用指针类型的iterator_traits类型的部分特化。
同样地,iterator_traits也会为其他迭代器进行特化,例如typename vector<T>::iterator

5
+1 表示不使用魔法。但是,是否存在一些特性(例如在 C++0x 标准库中),仅使用语言无法可靠定义,并且需要编译器的特殊“魔法”帮助才能正常工作? - UncleBens
@UncleBens:我不知道C++0x定义了哪些特性,但我确定在C++0x之前是没有这样的特性存在的。 - Konrad Rudolph
2
现在不是在std::underlying_type中发挥一种魔力吗? - Wolf
4
C++11增加了一些特性,这些特性不能在用户端实现,需要编译器的支持。是的,其中之一就是std::underlying_type - Konrad Rudolph
当我读到你的“没有魔法”时,我在想这个细节是否对这个问题有影响... - Wolf
1
@Wolf 嗯,这个答案是在 C++11 发布之前写的。 - Konrad Rudolph

44

Traits类并不确定对象的类型。相反,它们通过在trait中定义typedef或常量来提供有关类型的附加信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接