【CODE】trait与policy类

128 篇文章 0 订阅

一、trait类

#ifndef ACCUM_TRAITS_HPP
#define ACCUM_TRAITS_HPP

template<typename T>
struct AccumTraits;

template<>
struct AccumTraits<char>
{
    typedef int AccT;
    static AccT const zero = 0;
};

template<>
struct AccumTraits<short>
{
    typedef int AccT;
    static AccT const zero = 0;
};

template<>
struct AccumTraits<int>
{
    typedef long AccT;
    static AccT const zero = 0;
};

template<>
struct AccumTraits<unsigned int>
{
    typedef unsigned long AccT;
    static AccT const zero = 0;
};

template<>
struct AccumTraits<float>
{
    typedef double AccT;
    static AccT const zero = 0;
};

#endif

二、policy类

#ifndef SUM_POLICY_HPP
#define SUM_POLICY_HPP

struct SumPolicy
{
    template<typename T1, typename T2>
    static void accum(T1& total, T2 const& value)
    {
        total += value;
    }
};

#endif

三、实现类

#ifndef ACCUM_6_HPP
#define ACCUM_6_HPP

#include "trait/accumtraits.hpp"
#include "policy/SumPolicy.hpp"

template< typename T
        , typename Policy = SumPolicy
        , typename Traits = AccumTraits<T> >
struct Accum6
{
    static typename Traits::AccT accum(T const* beg, T const* end)
    {
        typename Traits::AccT total = Traits::zero;
        while (beg != end)
        {
            Policy::accum(total, *beg);
            ++beg;
        }      
        
        return total;
    }
};

#endif

四、使用

int num[] = {1, 2, 3, 4, 5, 6};
cout << "avg = " << Accum6<int>::accum(&num[0], &num[sizeof(num)/sizeof(int)]) << endl;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值