Cocoa的选择器的行为能否在C ++中重新实现?

时间:2016-06-24 16:54:22

标签: c++ objective-c cocoa selector

在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()。我也要求。

2 个答案:

答案 0 :(得分:2)

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

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

最终结果可能不同于“A C ++托管脚本引擎”,MFC样式模板,Q_OBJECT样式moc,手动q对象代码,某些自定义动态库插件解决方案,以及无数其他选项。

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

答案 1 :(得分:0)

可以使用模板。查看SFINAEstd::enable_if