假设有个计算类Calculator,它要处理int, long, float, double等数值类型。
用模板实现GetLimit()方法,获得每种类型的数值的上限LIMIT,
比如int的上限是100,long的上限是1000,float的上限是999.99,double的上限是888.8888888等等。
#include <iostream>
using namespace std;
struct Calculator {
template<typename T> T GetLimit()
{ return T(97); }
};
template<> int Calculator::GetLimit()
{ return int(100); }
template<> long Calculator::GetLimit()
{ return long(1000); }
template<> float Calculator::GetLimit()
{ return float(999.99); }
template<> double Calculator::GetLimit()
{ return double(888.888888); }
int main() {
Calculator cal;
cout << "Limit-int : " << cal.GetLimit<int>() << endl;
cout << "Limit-long : " << cal.GetLimit<long>() << endl;
cout << "Limit-float : " << cal.GetLimit<float>() << endl;
cout << "Limit-double : " << cal.GetLimit<double>() << endl;
cout << "Limit-char : " << cal.GetLimit<char>() << endl;
return 0;
}
这段代码看上去简单,用了template模板,
实际上它还想表达一种trait技巧。
模板也有自己的属性,我们称之为trait,而模板内部的操作逻辑称之为policy,即算法策略,
算法策略在最近大火的机器学习中起到核心作用,五道口有位学生用汇编写出了flappy bird,还能机器学习,着实厉害。
https://www.zhihu.com/question/29669428/answer/95783764
据他所言,定义一个行为矩阵,如果没死就给奖励,死了就给惩罚;
这样随着每一次决策,它都会进一步优化这个矩阵。
这即是算法策略中的一种。
举例说明模板trait:
#include <iostream>
using namespace std;
template<typename T>
T Accumulate(T const* begin, T const* end) {
T sum = T();
while (begin != end) {
sum += *begin;
begin++;
}
return sum;
}
int main() {
int test[10] = {1,2,3,4,5,6,7,8,9,10};
int r = Accumulate(test,test + 10);
printf("r is %d\n",r);
return 0;
}
从上面的例子可以看出,这东西称之为traits有点玄乎,实际上就是函数拉。
traits简单的分享先到这,有读者想深入学习可以参考:
http://en.cppreference.com/w/cpp/types
或者侯捷老师的
http://jjhou.boolan.com/programmer-6-type-traits-ddj.htm