c++ - 为什么重载函数的函数指针需要static_cast?
问题描述
对于下面的代码,我得到了错误
#include <iostream>
#include <functional>
using namespace std;
class A {};
class B {};
namespace N
{
void func(A a, int z){}
void func(B a, int z){}
}
void func_1(std::function<void(A, int)> x)
{
A a;
x(a, 1);
}
int main()
{
func_1(N::func);
return 0;
}
错误:
main.cpp:23:19: error: cannot resolve overloaded function 'func' based on conversion to type 'std::function<void(A, int)>'
23 | func_1(N::func);
如果我们为func_1(N::func);
as做静态转换func_1(static_cast<void (&)(A, int)>(N::func));
,那么这工作正常。但我希望这可以在没有演员表的情况下工作。
解决方案
std::function<void(A, int)>
比 更复杂void(*)(A, int)
。
template< class F > function( F f );
用 初始化目标
std::move(f)
。iff
是指向函数的空指针或指向成员的空指针,*this
调用后将为空。此构造函数不参与重载决议,除非对于参数类型和返回类型f
是Callable。Args...
R
N::func
在您确定您的意思之前,您甚至不知道哪些构造函数参与了重载决议。
可以设想一种组合的重载解决方案和模板参数推导方案,该方案可以通过尝试std::function<void(A, int)>::function<void(*)(A, int)>
(任意多个)构造函数的其他有效实例来“在中间相遇”。
问题比比皆是。
- 它必须可证明地得出一个答案。一般来说,模板有无限可能的实例化。
int(*)(A, int)
如果您通过了它,您还希望它能够选择int g(A, int)
。 - 它确实应该与当前的方案一致,从而得出明确的答案。
- 每个编译器供应商都必须正确实现它。
推荐阅读
- c++ - 为什么关联容器中的 end() 元素打印的值与最后一个元素相同?
- ignite - Apache Ignite.NET:一些 Ignite 节点在更新到 v2.9 后无法启动 - 检测到堆栈粉碎
- wordpress - 在特色图片上显示指向类别的链接
- encryption - ClientDatSet.LoadFromFile(DeCryptFile(XMLFile))?
- json - 如何提取转义的 JSON 值作为 Jmeter 中另一个外部 JSON 的值?
- amazon-web-services - AWS WAF 对 cloudfront 后面的 apigateway 没有影响
- microsoft-graph-api - 使用图形 api 在 Sharepoint/OneDrive 库中的文件夹中上传文件
- azure-devops - Azure DevOps 经典 CI 管道:签出是否隐含?
- dart - Dart 空安全 - 以空安全的方式从地图中检索值
- java - 如何关闭 PreparedStatement