C++ traits技术浅谈
前言 traits,又被叫做特性萃取技术,说得简单点就是提取“被传进的对象”对应的返回类型, 让同一个接口实现对应的功能 。因为STL的算法和容器是分离的,两者通过迭代器链接。算法的实现并不知道自己被传进来什么。萃取器相当于在接口和实现之间加一层 封装 ,来隐藏一些细节并协助调用合适的方法,这需要一些技巧(例如,偏特化)。最后附带一个小小的例子,应该能更好地理解 特性萃取。 下面大部分来源于《STL源码剖析》,看原书能了解更多细节。 Traits编程技法 让我们一点点抛出问题,然后一点点深入。 1. 首先,在算法中运用迭代器时,很可能会用到 其相应型别 (迭代器所指之物的型别)。假设算法中有必要声明一个变量,以“迭代器所指对象的型别”为型别,该 怎么办呢? 解决方法是:利用function template的参数推导机制。 1 template <class I, class T> 2 void func_impl(I iter, T t) { 3 T tmp; // 这里就是迭代器所指物的类型新建的对象 4 // ... 功能实现 5 } 6 7 template <class I> 8 inline 9 void func(I iter) { 10 func_impl(iter, *iter); // 传入iter和iter所指的值,class自动推导 11