当前位置: 首页 > news >正文

【CXX】6.2 str — rust::Str

Rust::Str 公共 API
// rust/cxx.h

class Str final {
public:
  Str() noexcept;
  Str(const Str &) noexcept;
  Str(const String &) noexcept;

  // 如果输入不是 UTF-8,抛出 std::invalid_argument 异常。
  Str(const std::string &);
  Str(const char *);
  Str(const char *, size_t);

  Str &operator=(const Str &) & noexcept;

  explicit operator std::string() const;

  // 注意:没有空终止符。
  const char *data() const noexcept;
  size_t size() const noexcept;
  size_t length() const noexcept;
  bool empty() const noexcept;

  using iterator = const char *;
  using const_iterator = const char *;
  const_iterator begin() const noexcept;
  const_iterator end() const noexcept;
  const_iterator cbegin() const noexcept;
  const_iterator cend() const noexcept;

  bool operator==(const Str &) const noexcept;
  bool operator!=(const Str &) const noexcept;
  bool operator<(const Str &) const noexcept;
  bool operator<=(const Str &) const noexcept;
  bool operator>(const Str &) const noexcept;
  bool operator>=(const Str &) const noexcept;

  void swap(Str &) noexcept;
};

std::ostream &operator<<(std::ostream &, const Str &);

注意事项

请注意,rust::Str 的行为类似于 &str,即它是一个借用!C++ 需要特别注意其生命周期。

再次强调:&str 对应的是 rust::Str。不要尝试将 &str 写成 const rust::Str &。C++ 语言级别的引用无法捕获 &str 的“胖指针”特性。

限制

允许作为函数参数或返回值。目前不支持在共享结构体中使用。&mut str 目前也不支持,但由于其使用场景极为罕见,因此影响不大。

示例

// src/main.rs

#[cxx::bridge]
mod ffi {
    extern "Rust" {
        fn r(greeting: &str);
    }

    unsafe extern "C++" {
        include!("example/include/greeting.h");
        fn c(greeting: &str);
    }
}

fn r(greeting: &str) {
    println!("{}", greeting);
}

fn main() {
    ffi::c("hello from Rust");
}
// include/greeting.h

#pragma once
#include "example/src/main.rs.h"
#include "rust/cxx.h"

void c(rust::Str greeting);

// src/greeting.cc

#include "example/include/greeting.h"
#include <iostream>

void c(rust::Str greeting) {
  std::cout << greeting << std::endl;
  r("hello from C++");
}

相关文章:

  • 几种linux获取系统运行时间的方法
  • Webservice创建
  • 技术进阶:数字人分身克隆系统源码+DeepSeek,实现前沿虚拟数字人应用的交互升级
  • 02.06、回文链表
  • 《深入浅出数据索引》- 公司内部培训课程笔记
  • 【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)
  • 【2025年28期免费获取股票数据API接口】实例演示五种主流语言获取股票行情api接口之沪深A股强势股池数据获取实例演示及接口API说明文档
  • 面试java做了一道逻辑题,人麻了
  • 你使用过哪些 Java 并发工具类?
  • 《人月神话》:软件工程的成本寓言与生存法则
  • 自动解单色数织程序(基于Python和Ortools)
  • 无人机的飞行路径规划之CH-PPO算法(思考)
  • 面试之《vue常见考题》
  • MySQL环境安装详细教程(Windows/macOS/Linux)
  • Spring 的三种注入方式?
  • 代码随想录刷题day42|(二叉树篇)二叉树的最小深度(递归)+完全二叉树结点个数
  • Java反射与动态代理:框架设计的基石
  • Spring WebFlux:响应式编程
  • 文字转语音chat-tts-ui
  • 分布式锁—Redisson的同步器组件
  • 特朗普与普京开始电话会谈,稍后将致电泽连斯基
  • 特朗普与普京开始进行电话会谈,稍后还将致电泽连斯基
  • 海军“吉祥方舟”号医院船开展海上卫勤演练
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 旅马大熊猫“福娃”“凤仪”平安回国
  • 纽约市长称墨海军帆船撞桥已致2人死亡,撞桥前船只疑似失去动力