调用任何指定函数的函数

时间:2015-07-15 20:00:08

标签: c++

如何使用指定的参数编写调用任何指定函数(或函数对象)的函数?

这是我尝试的内容:

#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;。

我不确定为什么在我的代码中无法推断出模板参数。

2 个答案:

答案 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建议参数。