首页 > 解决方案 > c++模板参数匹配std::function和函数指针

问题描述

我有一个函数包装器,它接受一个函数和一个参数列表,并使用这些参数调用该函数:

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

标签: c++template-argument-deduction

解决方案


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

wrapper(f1, 1, 2);

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


推荐阅读