语法
返回值类型可以写在参数括号的后面,用右箭头连接,前面用auto占位,这是为了进行返回类型的推导。
以下代码全篇没有用类型生命,auto和decltype完成全部类型推导。
#include <iostream>
using namespace std;
template<typename T1, typename T2>
auto Sum(const T1 & t1, const T2 & t2) -> decltype(t1 + t2) {
return t1 + t2;
}
template<typename T1, typename T2>
auto Mul(const T1 & t1, const T2 & t2) -> decltype(t1 * t2) {
return t1 * t2;
}
int main() {
auto a = 3;
auto b = 4L;
auto pi = 3.14;
auto c = Mul(Sum(a, b), pi);
cout << c << endl;
}
函数指针的类型推导
以下这段代码非常鬼畜,通过连续返回值推导得到一个嵌套的函数指针类型,比直接声明嵌套的函数指针要直观得多。
#include <type_traits>
#include <iostream>
using namespace std;
int (*(*pf())())() {
return nullptr;
}
// auto (*)() -> int(*) ()
// auto pf1() -> auto (*)() -> int (*)()
auto pf1() -> auto (*)() -> int (*)() {
return nullptr;
}
int main() {
cout << is_same<decltype(pf), decltype(pf1)>::value << endl;
}
转发函数
返回类型可以做成模板的样式,下面的代码中,Forward函数的返回类型是根据T不同而不同的。
#include <iostream>
using namespace std;
double foo(int a) {
return (double)a + 0.1;
}
int foo(double b) {
return (int)b;
}
template <class T>
auto Forward(T t) -> decltype(foo(t)) {
return foo(t);
}
int main() {
cout << Forward(2) << endl; // 2.1
cout << Forward(0.5) << endl; // 0
}