看过《STL源码剖析》的人,一定会知道里面讲到的Traits编程技法。刚开始看到书上这部分的介绍的时候,是有点不太理解这个技法的作用的,但是经过网上找资料了解之后,并且反复看了书上的内容之后,才渐渐了解到这个技法的重要性,对于迭代器及泛型思维的重要性。
一句话简述这个技法的主要作用,就是:可以通过迭代器的某个操作,直接获取迭代器里面保存的容器的元素类型。如果没有Traits技法,是无法实现这个操作的。要深刻了解Traits技法,依次理解下面的概念就可以了。
1. 迭代器相应型别(associated types)
什么是迭代器的相应识别,实际上就是指迭代器所指物(关联的容器的元素)的类型。因为C++中并不支持获取一个对象的类型的操作,更何况是将其类型作为一个变量来获取。在STL中,使用了function template的参数推导(argument deduction)机制来实现这个操作(一下源码来自《STL源码剖析》一书)。
template <class I, class T>
void func_impl(I iter, T t)
{
T tmp; // 这里解决了问题。T就是迭代器所指之物的型别,本例为int
// ... 这里做原本func()应该做的工作
}
template <class I>
inline
void func(I iter)
{
func_impl(iter, *iter); // func的工作全部移往func_impl
}
int main()
{
int i;
func(&i);
}