我正在使用 .mm (ObjC++) 将 C++ 引擎嵌入到 ObjC iOS 项目中。
// consumer.m
Wrapper* wrapper = ...;
[wrapper setupWithTarget: self
selector: @selector(gotData:)];
-(void) gotData: (int) k {...}
//wrapper.mm
@interface Wrapper() { id targ; SEL sel; } @end
:
-(void) setupWithTarget: T
selector: S] {
targ = T;
sel = S;
cppEngine = new cppEngine(); // i.e. C++ code
cppEngine.addCallback(
[](int data) {
std::cout << "got" << data;
[targ sel: data];
}
);
}
即我们设置cppEngine
给它一个回调;这里是一个 C++ lambda。
当引擎触发回调时,我们必须将数据传回给消费者。
我的问题是:什么是正确的架构来做到这一点?我不认为[targ sel: data];
是有效的目标 C。即使是,我也不确定 aSEL
是否会通过 lambda 的捕获。它甚至是一个有效的 C++ 对象吗?
我可以通过以下方式中的静态方法蹦床来看到一种方法wrapper.mm
:
cppEngine.addCallback(
[](int data) {
[CppEngine myStaticMethod: data];
}
);
...但这开始看起来很恶心。