- 比如方法max1的返回值是用typedef定义出来的mint,那么在类外如何定义这个方法呢?
template<typename T>struct aa{ typedef int mint; mint max1(T a); auto max2(T a) -> decltype(int(1)); mint data;};
template<typename T>mint aa<T>::max1(T a){}
template<typename T>aa<T>::mint aa<T>::max1(T a){}
template<typename T>typename aa<T>::mint aa<T>::max1(T a){}
-
比如方法max2的返回值是auto,那么在类外如何定义这个方法呢?使用decltype(c++11特性)。让decltype来推到出auto的类型
template<typename T>struct aa{ typedef int mint; mint max1(T a); auto max2(T a) -> decltype(int(1)); mint data;};template<typename T>typename aa<T>::mint aa<T>::max1(T a){ }template<typename T>auto aa<T>::max2(T a) -> decltype(int(1)){ return a;}int main(){ aa<int> a; auto x = a.max2(12); std::cout << x << std::endl;}
-
decltype用途最广的地方是在泛型编程中结合auto,用于追踪函数的返回值类型比如有一下方法,有2个模板参数Tx和Ty,返回值就2个模板参数类型对象的加法的和。这种情况,此函数的返回值是写Tx呢,还是写Ty呢?写哪个都不行,所以必须用decltype(_Tx + Ty)来推到出来。template <typename _Tx, typename _Ty>auto add(_Tx x, _Ty y)->decltype(_Tx*_Ty){ return x*y;}