细说 C++ Traits Classes

最近在看侯捷的《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。

偏特化(

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值