如何使用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
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...