将trait类模板用作模板参数
【引例】
//SumFixedTraits类模板 template <typename T> struct SumFixedTraits; template<> struct SumFixedTraits<char> { using sumT = int; static sumT initValue() { return 0; } }; template<> struct SumFixedTraits<int> { using sumT = __int64; static sumT initValue() { return 0; } }; template<> struct SumFixedTraits<double> { using sumT = double; static sumT initValue() { return 0.0; } }; //---------------------- //funcsum函数模板 template <typename T,typename U = SumFixedTraits<T> > //T auto funcsum(const T* begin, const T* end) { using sumT = typename SumFixedTraits<T>::sumT; sumT sum = SumFixedTraits<T>::initValue(); for (;;) { sum += (*begin); if (begin == end) break; ++begin; }//end for return sum; }
【将trait类模板用作模板参数】
//funcsum函数模板 template <typename T,typename U = SumFixedTraits<T> > auto funcsum(const T* begin, const T* end) { //using sumT = typename SumFixedTraits<T>::sumT; //sumT sum = SumFixedTraits<T>::initValue(); typename U::sumT sum = U::initValue(); for (;;) { sum += (*begin); if (begin == end) break; ++begin; }//end for return sum; }
- 调用
char mychararray[] = "abc"; cout << (int)(funcsum(&mychararray[0], &mychararray[2])) << endl;
- 输出
- 分析
template <typename T,typename U = SumFixedTraits<T> > //T = char ,U = SumFixedTraits<char> auto funcsum(const T* begin, const T* end) { typename U::sumT sum = U::initValue(); //typename SumFixedTraits<char>::sumT sum = SumFixedTraits<char>::initValue(); //int sum = 0;
【改变char返回值类型为__int64类型】
- 改变U的传入参数
char mychararray[] = "abc"; cout << (int)(funcsum<char, SumFixedTraits<int> >(&mychararray[0], &mychararray[2])) << endl;