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

来源:互联网 发布:centos vi 保存退出 编辑:程序博客网 时间:2024/05/22 08:29

一、需求引入

前一篇博客说明了用普通类来实现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
原创粉丝点击