通用目标到C++;翻译策略 我想把Objc通知处理程序暴露给我的C++客户端代码。 我是这样做的 我在一个C++对象中封装了一个Objc对象(称为Stista> x)。 X观察通知并注册回调(称之为F) >强> f>强>将Objc结构从通知转换为它们的C++对应,调用用户注册的全局C++回调函数(称为“强> FF”)。翻译后的C++结构成为 < F> > /LI>的输入参数。
现在的问题是参数的原始ObjC结构很复杂,包含需要翻译的多层ObjC对象 在我这方面,包装器观测者F不需要做任何特殊的事情,只需调用客户端的FF 在这一点上,我更合适的翻译策略是什么 我应该:通用目标到C++;翻译策略 我想把Objc通知处理程序暴露给我的C++客户端代码。 我是这样做的 我在一个C++对象中封装了一个Objc对象(称为Stista> x)。 X观察通知并注册回调(称之为F) >强> f>强>将Objc结构从通知转换为它们的C++对应,调用用户注册的全局C++回调函数(称为“强> FF”)。翻译后的C++结构成为 < F> > /LI>的输入参数。,c++,ios,objective-c,C++,Ios,Objective C,现在的问题是参数的原始ObjC结构很复杂,包含需要翻译的多层ObjC对象 在我这方面,包装器观测者F不需要做任何特殊的事情,只需调用客户端的FF 在这一点上,我更合适的翻译策略是什么 我应该: 将这些结构转换为所有成员的底层,这样我就有了等价的C++结构作为参数使用,或者, 创建一个C++类,将这些参数封装到一个对象中,并将类接口暴露给用户,以便他们在C++实现中使用那些C++包的参数,或者, 放弃包装的想法,让用户在ObjC中编码并直接注册他们自己的观察者函数 我的目标用户是iOS开发人员,他
<>我的目标用户是iOS开发人员,他们可能是也可能不是Android开发人员。
你可以在.mm实现文件中混合C++和ObjuleC++。这意味着你可以给C++ C++类的C++ LAMBDA(或块)提供引用。 大概是这样的:
实施.mm:@interface Shim : NSObject
{
std::function<void>() _notify;
}
@end
@implementation Shim
- void register_cpp(std::function<void>() f)
{
_notify = std::move(f);
}
- (void) my_handler()
{
if(_notify)
_notify();
}
@end
struct cpp_class::impl {
impl()
: _shim([Shim alloc[init]])
{
_shim.register_cpp(std::bind(&impl::callback, this));
}
private:
void callback() {
// do callback here;
}
Shim* _shim;
};
cpp_class::cpp_class()
: _impl(new impl)
{
}
cpp_class::~cpp_class()
{
delete _impl;
}
实际上,您需要小心确保在执行回调时对象仍然存在(主张弱_ptr::lock()、从_this启用_shared_等等),因为objective-c喜欢将回调放在线程的运行循环(基本上是一个队列)上这意味着C++对象可以在回调到达之前离开,但是这个代码应该给你正确的想法。
struct cpp_class{
cpp_class();
~cpp_class();
private:
struct impl;
impl* _impl;
};