![](/img/trans.png)
[英]How to pass a std::function from Objective-C++ to C++ method
[英]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: ... ];
}
然后,調用函數指針的調用者需要顯式傳遞一個控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.