从 std::function 推导出模板参数

Deducing template parameters from std::function

我正在写一些 class 使用静态模板成员函数试图映射 std::function 及其参数 :

class test
{
public:
    template <typename R, typename... Args>
    static double exec(std::function<R(Args...)> func, Args && ... args) {
        func(std::forward<Args>(args)...);
        // do something
        return 0.0;
    }
};

假设我有这些琐碎的功能:

我想这样调用我的 test::exec 函数:

test::exec(f1);
test::exec(f2, 4);
test::exec(f3, 1, 3.14f);

我正在使用 Visual Studio,我在第二种情况 (f2) 中遇到此错误:

error C2672: 'test::exec': no matching overloaded function found
error C2784: 'double test::exec(std::function<_Ret(_Types...)>,Args &&...)': could not deduce template argument for 'std::function<_Ret(_Types...)>' from 'int (__cdecl *)(int)'

不过,如果我在模板签名中指定类型,它会起作用:test::exec<int, int>(sq, 4); 显然,我想避免这种情况。另外,我不知道如何用这种语法来表达对 f1 的调用。

是否可以在不指定模板参数签名的情况下实现这个目标?

编译器无法推断出 std:function 参数和 return 类型,因为您根本没有传递 exec 一个 std::function


而不是 std::function,您可以让 exec 接受任意类型的可调用对象(包括函数),并让编译器推断其签名:

template <typename Func, typename... Args>
static double exec(Func func, Args && ... args);

如果您确实需要知道传递给 exec 的函数的 return 类型,您可以这样做:

template <typename Func, typename... Args>
static double exec(Func func, Args && ... args) 
{
  using R = decltype(func(args...));
  // ...
}

答案改编自@IgorTandetnik 的评论。