模板的Traits

来源:互联网 发布:ubuntu vnc客户端 编辑:程序博客网 时间:2024/06/04 18:52

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 ) ) );
原创粉丝点击