第3章 迭代器(iterator)
迭代器,容器与算法分离的关键,STL的灵魂
为了不过多暴露容器的内部细节,每个容器都封装了自己的迭代器。
文中接着讲了一个例子,如何通过一个迭代器来获得这个迭代器所指对象的类型(value_type),有点像Java里的反射
1 template <class I, class T> 2 void func_imp1(I iter, T t) 3 { 4 T tmp; 5 ... 6 } 7 template <class I> 8 inline 9 void func(I iter) 10 { 11 func_imp1(iter, *iter); 12 }
这个设计还是十分巧妙的。但是这个方法并不是万能的。
文中接着给出了另一个方法,并讲了traits机制,泛型与特化的一堆东西,很深奥,略过。
并且描述了为什么需要多个特化的版本,从而为容器中不同的iterator做铺垫。后面有句话讲的很好。
唯容器本身,才知道该设计出怎样的迭代器来遍历自己。
traits编程技法大量运用与STL实现品中,它利用“内嵌类型”的编程技巧与编译器的template参数推导功能,
增强C++未能提供的关于类型认证方面的能力,弥补了C++不是强类型(strong typed)语言的遗憾。
关于traits,我只知道traits就是为了为某些特性而不破坏泛型而引入的东西。
目前还没有找到特别好的例子。
关于iterator,如果容器加了const限制,那么iterator调用也必须使用const_iterator