語法
返回值類型可以寫在參數(shù)括號的后面襟士,用右箭頭連接览爵,前面用auto占位,這是為了進(jìn)行返回類型的推導(dǎo)段磨。
以下代碼全篇沒有用類型生命取逾,auto和decltype完成全部類型推導(dǎo)。
#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;
}
函數(shù)指針的類型推導(dǎo)
以下這段代碼非常鬼畜苹支,通過連續(xù)返回值推導(dǎo)得到一個嵌套的函數(shù)指針類型菌赖,比直接聲明嵌套的函數(shù)指針要直觀得多。
#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;
}
轉(zhuǎn)發(fā)函數(shù)
返回類型可以做成模板的樣式沐序,下面的代碼中,F(xiàn)orward函數(shù)的返回類型是根據(jù)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
}