模板:用双重模板参数实现 简单的 policy 类

一、需求引入

前一篇博客说明了用普通类来实现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; 

}; 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值