Cocoa 的选择器的行为可以在 C++ 中重新实现吗?

Can the behavior of Cocoa's selectors be reimplemented in C++?

在Cocoa框架中,所有NSObject实现了一个方法- respondsToSelector:,returns一个布尔值,表示接收方是否实现或继承了一个可以响应的方法到指定的消息。所以如果我想检查我的对象 foo 是否有方法 - bar:,我会使用消息 [foo respondsToSelector: @selector(bar:)];.

通过将选择器实现为 struct 或通过使用 std::function 对象作为参数,这种行为在具有相同接口的 C++ 中是否可能?例如,函数定义类似于以下之一:

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()。我要两者之一。

使用模板是可能的。查看 SFINAE and std::enable_if

Objective C是通过反射传递OO系统的消息。

您可以在 C++ 中使用反射实现消息传递 OO 系统,但它不包含 C++ 类 和接收消息的方法。

最终结果可能会有所不同,从 "A C++ hosted scripting engine",到 MFC 样式模板,到 Q_OBJECT 样式 moc,到手动 q 对象代码,到一些自定义动态库插件解决方案,到无数其他选项。

编译时的语言反射正在积极开发中。