如何将std::函数从objective - c++传递到c++方法

How to pass a std::function from Objective-C++ to C++ method

本文关键字:c++ 方法 std 函数 objective      更新时间:2023-10-16

我试图在objective - c++方法中创建std::function,并将其传递给c++方法。

然而,我得到一个坏的访问异常。我尝试过使用Objective-C块和lambda:

使用block:

std::function<void(void)> callback = ^{
    [self doSomething];
};
callback(); // <-- this works
self.myCppObject-> setButtonCallback(callback);

使用lambda:

std::function<void()> callback = [self]() {
    [self doSomething];
};
callback(); // <-- this works
self.myCppObject->setButtonCallback(callback);

在c++类中:

void MyCppClass::setButtonCallback (std::function<void()> callback)
{
    buttonCallback = std::move (callback); // <-- crash here
}

我也尝试过将callback存储在objective - c++类中作为属性:

@property (nonatomic, assign) std::function<void()> callback;

在这里抛出异常:(<functional>中的第1717行)

template<class _Rp, class ..._ArgTypes>
function<_Rp(_ArgTypes...)>&
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
{
    if (__f_ == (__base*)&__buf_) // <-- EXC_BAD_ACCESS here
        __f_->destroy();
    else if (__f_)
        __f_->destroy_deallocate();
    __f_ = 0;
    ...

来自c++方法中的回调赋值。我尝试使用std::move并通过=复制。

问题原来是myCppObject没有被初始化,因为它是在其构造函数中初始化它的类的子类,但是我调用的是基础[super init]而不是我需要的[super initWith...]。感谢@Roman提供的线索。

我试着运行你的代码,只有当属性self.myCppObject之前没有初始化时,我才收到同样的错误。尝试替换

self.myCppObject-> setButtonCallback(callback);

self.myCppObject = new MyCppClass();
self.myCppObject-> setButtonCallback(callback);

或检查是否正确初始化属性self.myCppObject .