我有一个函数包装器,其中包含一个函数和一个参数列表,并使用这些参数调用该函数:
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);
...它的格式正确,与编译器错误矛盾。
为什么编译器不接受第一个版本?
答案 0 :(得分:0)
推导模板参数时,编译器不执行任何转换。因此,在
wrapper(f1, 1, 2);
您正在从类型std::function<int(int, int)>
的函数指针请求int (*)(int, int)
的隐式构造。显式传递std::function<int(int, int>(f1)
时,无需转换参数,并且可以推导出参数推导。