如何将std::函数从objective - c++传递到c++方法
How to pass a std::function from Objective-C++ to C++ method
我试图在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
.
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法