在 Cocoa 框架中,所有 NSObject
都实现了一个方法 -respondsToSelector:
,该方法返回一个 bool 值,指示接收者是否实现或继承了可以响应指定的消息。因此,如果我想检查我的对象 foo
是否有方法 - bar:
,我会使用消息 [foo respondsToSelector: @selector(bar:)] ;
.
在具有相同接口(interface)的 C++ 中,通过将选择器实现为 struct
或通过使用 std::function
对象作为参数,这种行为是否可能?例如,函数定义如下所示之一:
bool Foo::respondsToSelector(const std::function<?> &selector) {
// Problem: Template arg and return types of this call would always be unknown.
}
bool Foo::respondsToSelector(const Selector *selector) {
}
Objective-C 可以在编译时或运行时确定选择器,具体取决于使用的是 @selector()
还是 NSSelectorFromString()
。我要求其中之一。
最佳答案
Objective C 是一个带有反射的消息传递 OO 系统。
您可以使用 C++ 中的反射实现消息传递 OO 系统,但它不包含具有接收消息的方法的 C++ 类。
最终结果可能会有所不同,从“C++ 托管脚本引擎”,到 MFC 样式模板,到 Q_OBJECT 样式 moc,到手动 q 对象代码,到一些自定义动态库插件解决方案,到无数其他选项。
编译时的语言反射正在积极开发中。
关于c++ - Cocoa 选择器的行为可以用 C++ 重新实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018514/