通过元编程减轻目标c 可可桥接?

通过元编程减轻目标c 可可桥接?,第1张

概述在纯C世界中,我们可以在编译时在不同组件或接口之间生成接口或粘合代码,使用基于模板的编译时和运行时技术的组合(例如大多数自动编组到/从使用传统类型的调用)。 当必须使用Objective-C/C++ocoa for GUI,系统集成或IPC来接口C应用程序时,由于较不严格的类型,事情变得更困难 – 但是通常不再需要平坦的回复接口层:瘦桥接代理必须定义或转换代码到语言桥接调用。 如果你必须处理非平凡 在纯C世界中,我们可以在编译时在不同组件或接口之间生成接口或粘合代码,使用基于模板的编译时和运行时技术的组合(例如大多数自动编组到/从使用传统类型的调用)。

当必须使用Objective-C/C++ocoa for GUI,系统集成或IPC来接口C应用程序时,由于较不严格的类型,事情变得更困难 – 但是通常不再需要平坦的回复接口层:瘦桥接代理必须定义或转换代码到语言桥接调用。

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

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

例如,我们需要一个支持这个非正式协议的委托:

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

而不是实现一个Obj-C类现在明确桥接到一个C-instance,我想这样做:

class CppObj {    ObjcDelegate m_del;public:    CppObj() : m_del(this)     {        m_del.addHandler            <Nsstring* (Nsstring*,Nsstring*)>            ("concatString",&CppObj::concat);        m_del.addHandler            <NSNumber* (CustomClass*)>            ("indexOf",&CppObj::indexOf);    }    std::string concat(const std::string& s1,const std::string& s2) {        return s1.append(s2);    }    size_t indexOf(const ConvertedCustomClass& obj) {        return 42;    }};

用户需要支持其他类型的所有功能将专门用于转换模板函数:

template<class To,class From> To convert(const From&);template<> Nsstring* convert<Nsstring*,std::string>(const std::string& s) {     // ...}// ...

上面的例子当然忽略对正式协议等的支持,但应该得到的。此外,由于Objc运行时类型的类型信息主要衰减为一些本机类型或类类型,我不认为可以避免代理方法的参数和返回类型的显式规范。

解决方法 我没有发现什么令人满意的,并提出了一个原型,由于以下非正式协议:

- (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*,&concatStrings);[someInstance setDelegate:objc.get_instance()];

然后可以使用:

Nsstring* result = [delegate concatString:@"abc" withString:@"def"];assert([result compare:@"abcdef"] == NSOrderedSame);

Boost.Function对象也可以传递,这意味着Boost.Bind也可以很容易地使用。

虽然基本的想法工作,这仍然是一个原型。我做了一个短的blog post这个主题和原型源是可用的via bitbucket.建设性的输入和想法欢迎。

总结

以上是内存溢出为你收集整理的通过元编程减轻目标c /可可桥接?全部内容,希望文章能够帮你解决通过元编程减轻目标c /可可桥接?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1044594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存