c++ - Cocoa 选择器的行为可以用 C++ 重新实现吗?

标签 c++ objective-c cocoa selector

在 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/

相关文章:

objective-c - 使用 AVFoundation 修改音频元数据

cocoa NSMenu 在位置添加 NSMenuItem

objective-c - 是否可以在运行时在 objective-c 中注册 KVO 依赖键?

objective-c - 什么是完成回调函数? C 或 Objective-C 中的示例?

c++ - 在 C++ 中确定指针限制的惯用方法是什么?

c++ - 当 ogl::Arrays 的默认构造函数运行时,Opencv2 崩溃

objective-c - 将 NSNumber* 传递给 NSString* 预期参数不会导致编译器警告/错误

objective-c - 使用 NSArrayController 对 NSTableColumn 进行排序

c++ - 根据抽象类快速确定子类

c++ - GCC 的 nm 列出了 method 的多个条目