有没有办法将函数从objective-c ++传递给标准c ++?

时间:2017-05-17 06:43:41

标签: c++ objective-c objective-c++

我想将objective-c ++函数指针传递给标准c ++,以便我可以在C ++上调用objective-c方法。

这是我想要实现的目标:

//C++ side
class CppSide
{
public:
    void(*TestFunction)();
};

//objective-c++ side
@interface InteropController : GLKViewController{
}
-(void) PickFile; //I want to pass PickFile address to TestFunction
@end

以下是我所做的,但不起作用

InteropController* controller = [[InteropController alloc] init];
CppSide* cppSide = new CppSide();
cppSide->TestFunction = [controller methodForSelector:@selector(PickFile:)];
cppSide->TestFunction(); //EXC_BADccess(code=1, address=0x2d)

我该怎么办?

1 个答案:

答案 0 :(得分:3)

懒惰,简单的方法是传递调用objC代码的std ::函数(例如,使用lambda)。

但是,你有一个原始的C函数指针。您将需要编写C函数(或使用非捕获lambda):

cppSide->TestFunction = [](){ ...  ObjC Code here ...};

但是,您无法在那里引用父作用域 - 仅限于全局作用域。

如果您可以改为使用std :: function,那么您将具有更大的灵活性:

cppSide->TestFunction = [=](){[controller PickFile: ... ];};

如果由于某种原因无法更改该函数指针类型,请考虑更改它,以便它至少需要一个数据指针:

class CppSide
{
public:
    void(*TestFunction)(void *data);
};

然后你可以这样做:

cppSide->TestFunction = [](void *data) {
    InteropController* controller = static_cast<InteropController*>(data);
    [controller PickFile: ... ];
}

调用函数指针的调用者需要显式传递控制器。