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 ) ) );
  • 相关阅读:
    函数声明例子
    税收工资分级
    attribute函数
    输出结果有误
    scanf_s()函数与数组,运行环境VS2013
    格式化输出
    功能点介绍和用户场景
    第二次作业合作版
    word count
    第一次作业
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310773.html
Copyright © 2011-2022 走看看