http://blog.csdn.net/zhoudaxia/article/details/4486487
这篇博客讲得挺清楚的,本来想自己写写看总结下的,不过看了下这个文章已经写得很清楚了,倒没有必要了,总得来说,要了解traits和policy,需要了解下面这三个点
1.什么是特化,什么是偏特化
顾名思义,特化就是针对一些特殊的类型进行变化,毕竟C++的模板是什么类型都能放进去的,但是有些类型就是比较独特,需要做特别的处理,这个就有了特化和偏特化,在这篇博客中作者特化了AccumulationTraits的int和char
2.利用typedef来抽象数据类型
当要把两个类中的不同的类型统一成一种类型要怎么办,就是typedef,在这篇博客中,作者讲int和chat全部typedef了acct,当然,所谓的typedef就是取个别名
3.typename除了定义模板类型,还能做什么用??
在我们编写模板代码的时候,我们经常会这样
template <typename T1,typename T2>
于是大部分人就认为typename的作用只是告诉编译器这个是模板的类型而已,其实typename还有一个隐藏功能,就是告诉编译器这个是一个type的name,而不是一个静态变量,想想看,我们在访问一个类的静态变量的时候,语法是这样的:
class_name::value_name;那么,如果我们的value_name是一个通过typedef定义的名称呢??编译器怎么知道??
这个时候就需要typename来告诉编译器了,typename class_name::value_name,这样编译器就会知道这个value_name是一个type的name,而不是一个static type了
不管是traits还是policy的模式,都是通过规定一个统一的接口或者类型来让一个函数或者类调用,当然所谓的统一跟纯虚函数一样都是通过名称来限制用户的行为,起码你需要写出这几个接口,不然编译就无法通过,不同的是,虚函数无法统一数据类型,而且虚函数是运行时确定的,而模板则是在编译时确定的