放松c&x2B+;通过元编程实现objective-c/cocoa桥接? 在纯C++世界中,我们可以在编译时使用不同的组件或接口在模板间编译时间和运行时技术(例如,使用遗留类型的调用来自动调用MaCurto),从而生成接口或粘贴代码。p> P>当必须将C++应用程序与ObjytoC/COCOA接口用于GUI、系统集成或IPC时,由于不太严格的类型化,事情变得更加困难,但通常不需要一个平坦的接口层:必须定义瘦桥接委托或转换代码到语言桥接调用。p>

放松c&x2B+;通过元编程实现objective-c/cocoa桥接? 在纯C++世界中,我们可以在编译时使用不同的组件或接口在模板间编译时间和运行时技术(例如,使用遗留类型的调用来自动调用MaCurto),从而生成接口或粘贴代码。p> P>当必须将C++应用程序与ObjytoC/COCOA接口用于GUI、系统集成或IPC时,由于不太严格的类型化,事情变得更加困难,但通常不需要一个平坦的接口层:必须定义瘦桥接委托或转换代码到语言桥接调用。p>,c++,objective-c,cocoa,metaprogramming,C++,Objective C,Cocoa,Metaprogramming,如果您必须处理非平凡大小的接口,并且希望避免基于脚本的代码生成,那么这很快就会变得很麻烦,而且每次必须进行重构时都会很痛苦。使用(模板)元编程和Objective-C运行时库的组合,应该可以大大减少代码量 在我重新发明轮子(可能是浪费时间)之前,有人知道这方面的技术、最佳实践或例子吗 例如,假设我们需要一个支持此非正式协议的代理: - (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2; - (NSNumber*)

如果您必须处理非平凡大小的接口,并且希望避免基于脚本的代码生成,那么这很快就会变得很麻烦,而且每次必须进行重构时都会很痛苦。使用(模板)元编程和Objective-C运行时库的组合,应该可以大大减少代码量

在我重新发明轮子(可能是浪费时间)之前,有人知道这方面的技术、最佳实践或例子吗


例如,假设我们需要一个支持此非正式协议的代理:

- (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2;
- (NSNumber*)     indexOf:(CustomClass*)obj;
- (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2;
现在,我不想实现显式桥接到C++实例的Obj-C类,而是想做如下操作:

CppObj类{
OBJCM_del代表;
公众:
CppObj():m_del(此)
{
m_del.addHandler
(“concatString”和CppObj::concat);
m_del.addHandler
(“indexOf”和CppObj::indexOf);
}
std::string concat(常量std::string&s1,常量std::string&s2){
返回s1.追加(s2);
}
大小索引(const ConvertedCustomClass&obj){
返回42;
}
};
用户需要专门化转换模板函数,才能支持其他类型:

template<class To, class From> To convert(const From&);

template<> 
NSString* convert<NSString*, std::string>(const std::string& s) { 
    // ...
}

// ...
要转换的模板(const From&);
模板
NSString*转换(const std::string&s){
// ...
}
// ...

上面的例子当然忽略了对正式协议等的支持,但应该能够理解这一点。此外,由于Objc运行时类型的类型信息大部分被分解为一些本机类型或类类型,我认为无法避免为委托方法显式指定参数和返回类型。

您看过wxWidgets库吗?我不在ObjuleC中进行编码,但至少开发人员声称对COCOA/ObjtoV.C有着不错的支持,这意味着它们有某种C++实现的映射。图书馆的网站是。

我没有发现任何令人满意的东西,根据以下非正式协议,我提出了一个原型:

- (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2;
- (NSNumber*)     indexOf:(CustomClass*)obj;
- (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2;

和C++代码:

struct CppClass {
    std::string concatStrings(const std::string& s1, const std::string& s2) const {
        return s1+s2;
    }
};

std::string concatStrings(const std::string& s1, const std::string& s2) {
    return s1+s2;
}
允许创建和传递委托:

CppClass cpp;
og::ObjcClass objc("MyGlueClass");
objc.add_handler<NSString* (NSString*, NSString*)>
    ("concatString:withString:", &cpp, &CppClass::concatStrings);
// or using a free function:
objc.add_handler<NSString* (NSString*, NSString*)>
    ("concatString:withString:", &concatStrings);
[someInstance setDelegate:objc.get_instance()];
也可以传递Boost.Function对象,这意味着Boost.Bind也可以很容易地使用


虽然基本思想可行,但这仍然是一个原型。我做了一个简短的主题和原型来源是可用的。欢迎提出建设性意见。

这是一个非常有趣的问题。我做了很多这种包装,虽然我使用了很多模式,但我从未真正找到一种元编程方法来简化模式。这将是有趣的,看看是否有人有。C++模板不能用于创建Objc类,C++缺少足够的运行时内省来动态创建Objc类。但是,某种模板语言可能是合适的;甚至可能是基于宏的。我目前正在为我在Cocoaphany(robnapier.net)的下一篇帖子研究这个主题,所以我必须对它进行更多的思考。除非我忽略了什么,否则我至少可以使用Obj-C运行时修改和扩展Objective-C类(还没有研究类注册部分)。利用模板检查C++签名绑定等,我不认为这个方向有很大的问题…至少现在还没有,我提出这个问题的原因之一是:)在我从事的项目中,我们使用以下方法:XML+外部代码生成器。我不知道这是否是你的选择,但无论如何。。。据我所知,这种方法在一开始是痛苦的,但之后你不必每次都“重新发明”解决方案。不管你使用多少种语言。是的,在我们的例子中,XML文件也是生成的:它可以通过GUI前端访问(但当然,无论如何,您都可以直接更改XML)。我不喜欢外部代码生成,只将其用作最后手段。有趣的问题是如何使用元编程来尽可能避免代码生成器的需要。我想当我的私人Mac到来时,我将不得不开始测试我的想法。这个问题非常有趣+1,我希望听到你的实验结果@gf。谢谢,似乎有一些通知桥接-稍后将不得不阅读更多。很好的提示,但不是很令人满意。