C ++模板参数匹配带有函数指针的std :: function

时间:2019-01-21 14:12:49

标签: c++ template-deduction

我有一个函数包装器,其中包含一个函数和一个参数列表,并使用这些参数调用该函数:

template<typename R, typename... Args>
R wrapper(std::function<R(Args...)> f, Args... args) {
    auto ret = f(args...);
    return ret;
}  

但是以下内容无法编译:

int f1(int a, int b) { return a+b; }

wrapper(f1, 1, 2);

它说:

  

类型不匹配的“ std :: function <_Res(_ArgTypes ...)>”和“ int(*)(int,int)”

但是,如果我这样做:

wrapper(std::function<int(int, int)>(f1), 5, 10);

...它的格式正确,与编译器错误矛盾。

为什么编译器不接受第一个版本?

演示跟踪:https://onlinegdb.com/rJWzZIQX4

1 个答案:

答案 0 :(得分:0)

推导模板参数时,编译器不执行任何转换。因此,在

wrapper(f1, 1, 2);

您正在从类型std::function<int(int, int)>的函数指针请求int (*)(int, int)的隐式构造。显式传递std::function<int(int, int>(f1)时,无需转换参数,并且可以推导出参数推导。