最近在看侯捷的《STL源码剖析》,看到第三章有关 traits 的介绍,被搞得一头雾水,看了半天不知所云。为了彻底了解这个技法的原理,硬着头皮上网查了资料,并结合 Scott Meyers 的 《Effective C++》,总算是把 traits 的原理搞明白了:)
什么是 traits?我们先来看下 C++ 之父的回答:
Think of a trait as a small object whose main purpose is to carry information used by another object or algorithm to determine “policy” or “implementation details”. - Bjarne Stroustrup
在 C++ 中,traits 习惯上总是被实现为 struct
,但它们往往被称为 traits classes。Traits classes 的作用主要是用来为使用者提供类型信息。
模板特化(Template Specialization)
为了清晰理解 traits 的原理,我们先来看 traits 使用的关键技术 —— 模板的特化与偏特化。
我们先来看下一函数模板的通用定义:
template<typename T>
struct my_is_void {
static const bool value = false;
};
然后,针对 void
类型,我们有以以下的特化版本:
template<>
struct my_is_void<void> {
static const bool value = true;
};
测试代码如下:
my_is_void<bool> t1;
cout << t1.value << endl; // 输出0
my_is_void<void> t2;
cout << t2.value << endl; // 输出1
当声明 my_is_void<void> t2;
时,使用的是特化版本,故其 value
值为 1。