c++ - 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);
...它将是格式正确的,这与编译器错误相矛盾。
为什么编译器不接受第一个版本?
解决方案
推导模板参数时,编译器不执行任何转换。因此,在
wrapper(f1, 1, 2);
您正在std::function<int(int, int)>
从类型的函数指针请求隐式构造int (*)(int, int)
。当显式传递std::function<int(int, int>(f1)
时,不需要转换参数,并且参数推导工作。
推荐阅读
- xcode - Xcode:是否可以导出 SF 符号并导入 Xcode 以支持旧版本?
- image - gatsby : 优化没有'childImageSharp' graphql 字段的图像
- c# - 首先在 Entity Framework 6.4.4 数据库中实现自定义导航属性
- c++ - 使用 SDL2 渲染器绘制填充四边形/三角形的最快方法?
- recursion - 当我在 max 变量下方运行查询时,没有更新,我不明白为什么
- c# - 保存 16 位灰度图像的结构
- linux - phpspreadsheets/phpoffice 在 linux 上不工作
- java - Hibernate @Formula 返回集合
- facebook - Facebook 消息 webhook JSON 方案中这种差异的原因是什么?
- c++ - 向量
> 保存到 QSettings