我正在编写一个将std :: function作为输入并对该函数进行一些处理的模板函数。我想要一种自动处理任何函数的方法,但是我在类型推导中遇到了传递引用的问题。
我使用的函数类型很普通,参数列表以及类型也有所不同。这是一个复制者
#include <iostream>
#include <chrono> //c++11
#include <functional> //c++11
using namespace std;
// for use with functions passing by value
template<typename T_Out, typename... T_Args>
inline int get_stats( T_Out f(T_Args...), T_Args&... args)
{
f(args...);
return 0;
}
int foo(int x, double y)
{ return 0; }
int goo(int& x, double& y)
{ return 0; }
int hoo(int x , double& y)
{ return 0; }
int main()
{
int x = 42;
double y = 0.0;
cout << get_stats( foo, x, y) << endl;
return 0;
}
以上模板适用于foo
,如果我将hoo
替换为f(T_Args...)
,我可以使f(T_Args&...)
正常工作,但是我无法无需显式编写与传递类型相匹配的模板即可工作,那时候我也可能根本不使用模板。
如何自动处理传递类型?此外,能够自动处理prvalues也很不错。如果可能的话,我也想将其限制为c ++ 11。
答案 0 :(得分:0)
为响应更好的解决方案而进行了编辑:
您要在此处使用的是斯科特·迈耶斯(Scott Meyers)所说的通用参考书:
req.body.exames.hematologia
// => Hematologia
req.body.exames.vhs
// => VHS
当模板参数后跟双与号时,根据您传递的值,它将是左值引用或右值引用。然后,您调用std :: forward,它将继续使用正确的引用类型。
答案 1 :(得分:0)
template<typename T_Func, typename ...T_Args>
inline int get_stats(T_Func f, T_Args&&... args)
{
return f(args...);
}
int foo(int x, double y)
{ return x + y; }
int goo(int& x, double& y)
{ return x - y; }
int hoo(int x , double& y)
{ return x * y; }
int main()
{
int x = 42;
double y = 1.5;
cout << get_stats(foo, x, y) << endl;
cout << get_stats(goo, x, y) << endl;
cout << get_stats(hoo, x, y) << endl;
return 0;
}
答案 2 :(得分:0)
实际上,您需要结合两个先前的答案。 KorelK的答案以避免尝试推断出传递的函子的确切签名,而CJ13的答案则使用完美转发:
template<typename T_Func, typename ...T_Args>
inline int get_stats(T_Func f, T_Args&&... args)
{
return f(std::forward<T_Args>(args)...);
}