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 对象代码,到一些自定义动态库插件解决方案,到无数其他选项。
编译时的语言反射正在积极开发中。
在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 对象代码,到一些自定义动态库插件解决方案,到无数其他选项。
编译时的语言反射正在积极开发中。