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 ) ) );
  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310773.html
Copyright © 2011-2022 走看看