如何解决如何使用cxx板条箱调用C ++构造函数?
我找到了this question,但是它已经3岁了,从那时起,就出现了像cxx
这样的板条箱。现在是否可以从Rust构造C ++对象,还是我仍然需要创建垫片?
解决方法
就构造函数按值“返回” C ++类型而言,它们不能转换为Rust,因为Rust动作(memcpy)与C ++动作不兼容(这可能需要调用move构造函数)。将任意构造函数转换为fn new() -> Self
是不正确的。
您可以使用assumes moving without a constructor call is okay的bindgen不安全地绑定它们,也可以在自述文件中使用“共享结构”方法,该方法可以以任何一种语言安全地移动,或者您可以include!
使用填充程序unique_ptr或类似名称后面的结构。
最后一种方法类似于:
// suppose we have a struct with constructor `ZeusClient(std::string)`
// in a C++ header:
std::unique_ptr<ZeusClient> zeus_client_new(rust::Str arg);
// in the corresponding C++ source file:
std::unique_ptr<ZeusClient> zeus_client_new(rust::Str arg) {
return make_unique<ZeusClient>(std::string(arg));
}
// in the Rust cxx bridge:
extern "C++" {
include!("path/to/zeus/client.h");
include!("path/to/constructorshim.h");
type ZeusClient;
fn zeus_client_new(arg: &str) -> UniquePtr<ZeusClient>;
}
将来,CXX很可能会为此模式或某些特殊的结构而内置一些东西,而这种特殊情况下没有移动构造函数。在dtolnay/cxx#280中进行了跟踪。
extern "C++" {
type ZeusClient;
fn new(arg: &str) -> ZeusClient; // will verify there is no move constructor
fn new(arg: &str) -> UniquePtr<ZeusClient>; // okay even with move constructor
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。