当必须使用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 /可可桥接?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)