簡體   English   中英

有沒有辦法將函數從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: ... ];
}

然后,調用函數指針的調用者需要顯式傳遞一個控制器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM