Traits编程技巧
主要在STL用于萃取模板特性,(更详细的描述可以参考侯捷《STL源码剖析3.4》)具体如下:
注意:func的返回值必须加上typename关键字,因为T是一个template参数,在它编译之前,编译器对T毫无知情,即是编译器并不知道MyIter<T>::value_type是一个函数还是一个类型型别或者是一个成员变量,因此编译时候会产生二义性。而关键字typename在此则显示声明value_type为类型型别。所以可以顺利编译通过。
另外我们从上面还可以发现有个陷阱,对于原生指针(一般指针非智能指针非弱指针等,比如:int*p =new int[10]),我们无法将其定义为内嵌型别。那我们又应该如何解决呢?
然而答案是肯定的,因为c++中提供另外一个强大特性,即是模板特化,所以我们可以将上面版本稍微作调整。
这就是traits。不求甚解的结果就是:oh so da si nie。that's all。