📅  最后修改于: 2023-12-03 15:41:27.511000             🧑  作者: Mango
有时候在编写代码过程中,我们需要获取一个函数的返回类型。这在模板编程或者一些复杂的泛型算法中非常有用。
下面我们将介绍C++中获取函数返回类型的多种方法。
C++11引入了 decltype
关键字,可以用来推导表达式的类型。同时,还有一种比较特殊的用法 decltype(auto)
可以推导一个变量或者表达式的类型,并且会保持原来的引用/值特性。
这里我们可以使用 decltype(auto)
来获取函数的返回类型:
auto foo() -> int& {
static int x = 10;
return x;
}
int main() {
decltype(auto) result = foo(); // result类型为int&
return 0;
}
C++11中提供了 std::result_of
模板,用来获取一个函数调用后的返回类型。需要注意的是,std::result_of
要求函数必须是可调用的类型(可以是函数指针、函数对象、成员函数指针等)。
struct Foo {
int operator()() const { return 0; }
};
int bar() { return 0; }
int main() {
std::result_of<Foo()>::type result1 = 0; // result1类型为int
std::result_of<decltype(bar)&()>::type result2 = 0; // result2类型为int
return 0;
}
在C++14中,我们还可以使用 decltype(auto)
来获取一个表达式的类型,并会保持原有的引用/值特性。这里我们可以将函数调用作为这个表达式:
auto foo() -> int& {
static int x = 10;
return x;
}
int main() {
decltype(auto) result = foo(); // result类型为int&
return 0;
}
我们介绍了C++中获取函数返回类型的三种方法,包括C++11的 decltype(auto)
和 std::result_of
,以及C++14新增的简化了的 decltype(auto)
。
这些方法都可以在泛型编程和元编程中非常有用,有助于我们解决更多的编程难题。