5.1 使用函数返回类型后置声明函数
auto foo()->int {return 5; }//等价于 int foo() {return 5; }在返回函数指针的时候要简洁一点 平常的做法是 using bar = int(*)(int); int bar_impl(int x) {return x; }bar foo1() {return bar_impl; }//使用后置 int bar_impl(int x) {return x; } auto foo1()->int(*)(int)//就是好看了一点 {return bar_impl; }
5.2 推导函数模板返回类型
一般写法·
class IntWrap { public:IntWrap(int n) : n_(n) {}IntWrap operator+ (const IntWrap& other){return IntWrap(n_ + other.n_);}private:int n_; };template<class T1, class T2> auto sum1(T1 t1, T2 t2)->decltype(t1 + t2) {return t1 + t2; }//还有一个简单版本 template<class T1, class T2>//这里要求T1和T2要有默认的构造函数才行 decltype(T1() + T2()) sum2(T1 t1, T2 t2) {return t1 + t2; }//解决方案 template<class T1, class T2>//这里先给转为指针再解引用 decltype(*static_cast<T1*>(nullptr) + *static_cast<T2*> (nullptr)) sum3(T1 t1, T2 t2) {return t1 + t2; }template<class T> T&& declval(); template<class T1, class T2> decltype(declval<T1>() + declval<T2>()) sum4(T1 t1, T2 t2) {return t1 + t2; }int main() {sum3(IntWrap(1), IntWrap(2));sum4(IntWrap(1), IntWrap(2)); }