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

Is there a way to pass function from objective-c++ to standard 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)

我该怎么办?

懒惰、简单的方法是传递调用 objC 代码的 std::function(例如,使用 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: ... ];
}

调用函数指针的调用者需要明确传递一个控制器。