如何使用指定的参数编写调用任何指定函数(或函数对象)的函数?
这是我尝试的内容:
#include <iostream>
#include <functional>
using namespace std;
template <typename RetType, typename... ArgTypes>
RetType q(function<RetType(ArgTypes...)> f, ArgTypes... args)
{
return f(args...);
}
int h(int a, int b, int c) { return a + b + c; }
int main()
{
auto r = q(h, 1, 2, 3);
cout << "called, result = " << r;
return 0;
}
编译器说,由于类型不匹配导致模板参数推断/替换失败&#std :: function&lt; _Res(_ArgTypes ...)&gt;&#39;和&#39; int(*)(int,int,int)&#39;。
我不确定为什么在我的代码中无法推断出模板参数。
答案 0 :(得分:3)
因为它无论如何都是模板,所以根本不需要std::function
。就这样做:
template <class F, class... Arg>
auto q(F f, Arg... arg) -> decltype(f(arg...))
{
return f(arg...);
}
更好的是,使用完美转发:
template <class F, class... Arg>
auto q(F f, Arg&&... arg) -> decltype(f(std::forward<Arg>(arg)...))
{
return f(std::forward<Arg>(arg)...);
}
答案 1 :(得分:0)
你可能正在为一个简单的问题迈出一条艰难的道路...... 你可以使用不带参数的闭包......
#include <iostream>
#include <functional>
using namespace std;
int h(int a, int b, int c) { return a + b + c; }
int main()
{
auto clsr = [](){ return h(1, 2, 3); };
auto r = clsr();
cout << "called, result = " << r;
return 0;
}
的优点是IDE在编写/编辑此类代码时甚至会为h
建议参数。