代码如下:
#include <iostream> #include <memory> #include <string> using namespace std; template<class Function,class ... Args> inline auto FuncWrapper(Function &&f, Args && ... args)-> decltype(f(std::forward<Args>(args)...)) { return f(std::forward<Args>(args)...); } void test0() { std::cout << "void" << endl; } int test1() { return 1; } int test2(int x) { return x; } std::string test3(std::string s1, std::string s2) { return s1 + s2; } int main() { FuncWrapper(test0); std::cout << FuncWrapper(test1) << std::endl; std::cout << FuncWrapper(test2,2) << std::endl; std::cout << FuncWrapper(test3,"tang","miao") << std::endl; return 0; }
前面有介绍右值引用,这里介绍一下为什么可以自动推导返回值
auto 函数名()->decltype(){}
是自动推导函数的返回值类型,如,C++里面想要实现任何2个基础类型的加法,如下:
template<class T, class U> auto addFunction(T t, U u)->decltype(t + u) { return t + u; }
decltype可以推导表达式类型,这里相当于直接传递给auto,返回值类型就确定了。或者比较高级一点的:
int& foo(int& i); float foo(float& f); template<class T> auto func(T& val)->decltype(foo(val)) { return foo(val); }
这个可以直接执行不同的重载函数。
这种返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法,对于返回值类型的推导就可以明确的表示出来了。
代码来自<<深入应用C++11:代码优化与工程级应用>> 祁宇,第2章。C++11之后真是博大精深