模板的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 ) ) );

你可能感兴趣的:(traits)