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