zoukankan      html  css  js  c++  java
  • 模板的Traits

    Traits含义就是特性,应用Trait模板参数,使得我们的程序既保持灵活性,同时减少类型参数的数量。能够使得我们对函数进行更加细粒度的控制。


    #ifndef TRAIT_H_
    #define TRAIT_H_
    /*
    template<typename T>
    T accumulate( const T *begin, const T *end )
    {
        T total = T();
    
        while ( begin != end ) {
            total += *begin;
            ++begin;
        }
    
        return total;
    }*/
    
    
    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 long AccT;
        static AccT zero() {
            return 0;
        }
    };
    
    template<>
    class AccumulationTraits<unsigned int>
    {
    public:
        typedef unsigned long long AccT;
        static AccT zero() {
            return 0;
        }
    };
    
    template<>
    class AccumulationTraits<float>
    {
    public:
        typedef double AccT;
        static AccT zero() {
            return 0;
        }
    };
    
    template<typename T, typename AT = AccumulationTraits<T> >
    class Accum
    {
    public:
        static typename AT::AccT accumulate( const T *begin, const T *end ) {
            typename AT::AccT total = AT::zero();
    
            while ( begin != end ) {
                total += *begin;
                ++begin;
            }
    
            return total;
        }
    };
    
    template<typename T>
    typename AccumulationTraits<T>::AccT accumulate( const T *begin,
            const T *end )
    {
        return Accum<T>::accumulate( begin, end );
    }
    
    template<typename Traits, typename T>
    typename Traits::AccT accumulate( const T *begin, const T *end )
    {
        return Accum<T, Traits>::accumulate( begin, end );
    }
    
    #endif
    int iv[5] = {1, 2, 3, 4, 5};
    double ftotal = accumulate<typename AccumulationTraits<float>, int>( iv, iv + sizeof( iv ) / sizeof( int ) );
    EXPECT_EQ( 15,  ftotal );
    
    char cv[] = {'a', 'a', 'b', 'b'};
    int total = 97 * 2 + 98 * 2;
    EXPECT_EQ( total , accumulate( cv, cv + sizeof( cv ) / sizeof( char ) ) );
  • 相关阅读:
    使用eclipse的时候maven项目的项目没有问题,但是项目报×
    大数据学习笔记5
    大数据学习笔记4
    Docker端口映射
    hadoop集群访问——Hadoop客户端访问、Java API访问
    Hadoop环境搭建--Docker完全分布式部署Hadoop环境(菜鸟采坑吐血整理)
    Java反射
    大数据学习笔记3
    大数据学习笔记2
    大数据学习笔记1-大数据处理架构Hadoop
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310773.html
Copyright © 2011-2022 走看看