C++ 模板与继承的高级技巧
1. 特性与策略类
1.1 特性模板的起源与发展
Nathan Myers 最早将特性参数的概念形式化。最初,他将其以“行李模板”(baggage templates)的名称呈现给 C++ 标准化委员会,用于定义标准库组件中字符类型的处理方式。不过,部分委员会成员不喜欢“行李”这个术语,于是“特性”(traits)这个名称被推广使用,并且此后得到了广泛应用。
1.2 特性模板的使用与注意事项
客户端代码通常无需处理特性,因为默认的特性类能满足大多数常见需求,而且它们作为默认模板参数,无需在客户端源代码中显式出现。因此,默认特性模板宜使用较长的描述性名称。当客户端代码通过提供自定义特性参数来调整模板行为时,将结果特化 typedef 为适合自定义行为的名称是个不错的做法。
特性模板并不局限于类模板。若只需提供单个策略特性,可将其作为普通函数模板传递,示例代码如下:
template <typename T, void (*Policy)(T const&, T const&)>
class X;
但特性的初衷是减少次要模板参数的“负担”,若仅将单个特性封装在模板参数中,就无法达成这一目标,这也解释了 Myers 倾向于用“行李”来指代特性集合的原因。
1.3 标准库中的特性模板
标准库定义了多个特性模板,具体如下:
| 特性模板 | 用途 |
| ---- | ---- |
|
超级会员免费看
订阅专栏 解锁全文
11万+

被折叠的 条评论
为什么被折叠?



