有没有办法将函数从 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: ... ];
}
调用函数指针的调用者需要明确传递一个控制器。
我想将 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: ... ];
}
调用函数指针的调用者需要明确传递一个控制器。