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 ) ) );