?trait
template <typename T>
T accum(T const* beg,T const* end)
{
T total = T();//假设T事实回生成一个等于0的值
while(beg!=end)
{
total += *beg;// 问题是假如 T类型 是char ,和就会溢出
beg++;
}
return total;
}
? 把上面的和的类型改为 AccumTraits<T>::Acct ,简单方法再传一个模板参数 ? 把上面的初始化值改为 AccumTraits<T>::zero ,简单方法调用时再传一个实参作为初始值?
template<typename T>
class AccumTraits
{};
template<>
class AccumTraits<char>
{
public :
typedef int AccT;
static Acct const zero = 0;//若是不支持类成员静态变量,可以下面方式
static Acct zero()
{
return 0;
}
}
policy
template<typename T,typename Policy>
AccumTraits::AccT accum(T const* beg,T const* end)
{
AccumTraits::AccT total = AccumTraits::zero;
while(beg!=end)
{
Policy::accumulate::(total,*beg);
beg++;
}
return total;
}
class SumPolicy//这个是用来求和的,当然还可以有求积的,有最高值的。
{
public:
template<typename T1,typename T2>
static void accumulate(T1&total,T2 const& value)
{
total+=value;
}
};
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
accum<int,SumPolicy>(array,array+5);//这里用SumPolicy代替
}
总结
trait就是从模板T里取出它的特性,而policy更多代表行为,算法。
|