一、需求引入
前一篇博客说明了用普通类来实现policy的接口,接下来让我们用模板类来实现policy的接口
二、实现
第一种实现方式:policy是一个模板类: 类型模板类
template<typename T>
class AccumulationTraits;template<>
class AccumulationTraits<char> {
public:
typedef int AccT;
static AccT zero() {
return 0;
}
};
template<>
class AccumulationTraits<short> {
public:
typedef int AccT;
static AccT zero() {
return 0;
}
};
template<>
class AccumulationTraits<int> {
public:
typedef long AccT;
static AccT zero() {
return 0;
}
};
template<>
class AccumulationTraits<unsigned int> {
public:
typedef unsigned long AccT;
static AccT zero() {
return 0;
}
};
template<>
class AccumulationTraits<float> {
public:
typedef double AccT;
static AccT zero() {
return 0.0;
}
};
//policy实现
template <typename T1, typename T2>
class SumPolicy {
public:
static void accumulate (T1& total, T2 const & value) {
total += value;
}
};
//Accum 接口实现:双重模板参数
template <typename T,
template<typename,typename> class Policy = SumPolicy,
typename Traits = AccumulationTraits<T> >
class Accum {
public:
typedef typename Traits::AccT AccT;
static AccT accum (T const* beg, T const* end) {
AccT total = Traits::zero();
while (beg != end) {
Policy<AccT,T>::accumulate(total, *beg);
++beg;
}
return total;
}
};
第二种实现方式:policy是一个 非类型模板类
特点:可以适当的拓展
//非类型模板缺省参数
template<bool use_compound_op = true>
class SumPolicy {
public:
//成员模板
template<typename T1, typename T2>
static void accumulate (T1& total, T2 const & value) {
total += value;
}
};
//特化
template<>
class SumPolicy<false> {
public:
template<typename T1, typename T2>
static void accumulate (T1& total, T2 const & value) {
total = total + value;
}
};