在Cocoa框架中,所有NSObject
都实现了一个方法- respondsToSelector:
,该方法返回一个布尔值,指示接收方是实现还是继承可以响应指定消息的方法。因此,如果我想检查对象foo
是否有方法- bar:
,我会使用消息[foo respondsToSelector: @selector(bar:)];
。
在具有相同接口的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()
。我也要求。
答案 0 :(得分:2)
Objective C是一个通过反射传递OO系统的消息。
您可以使用C ++中的反射实现传递OO系统的消息,但它不包含带有接收消息的方法的C ++类。
最终结果可能不同于“A C ++托管脚本引擎”,MFC样式模板,Q_OBJECT样式moc,手动q对象代码,某些自定义动态库插件解决方案,以及无数其他选项。
在编译时的语言反射正在积极开发中。
答案 1 :(得分:0)
可以使用模板。查看SFINAE和std::enable_if。