【发布时间】:2019-06-14 22:48:06
【问题描述】:
我有一个函数包装器,它接受一个函数和一个参数列表,并使用这些参数调用函数:
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 ...>'和'int (*)(int, int)'
但是,如果我这样做:
wrapper(std::function<int(int, int)>(f1), 5, 10);
...它将是格式正确的,这与编译器错误相矛盾。
为什么编译器不接受第一个版本?
【问题讨论】:
-
这里没有矛盾。编译器告诉您
std::function<_Res(_ArgTypes ...)>与int (*)(int, int)的类型不同(并且不允许将后者隐式转换为前者)。在您的第二个示例中,您显式转换它以便编译器满意。 -
FWIW,在 C++17 中,
std::function<int(int, int)>(f1)可以缩短为std::function{f1},以节省您的打字和重复次数。 -
@StoryTeller 嗯,这对我不起作用:
candidate template ignored: could not match 'function<int (type-parameter-0-1...)>' against 'int (*)(int, int)' -
也高度相关,也告诉你为什么lambdas也有这个问题:stackoverflow.com/questions/9998402/…
-
@lubgr - 有趣。我会认为使用推导/指定的类型就足够了。哦,好吧。
标签: c++ template-argument-deduction