【CXX】6.2 &str — rust::Str

Rust::Str 公共 API
cpp 复制代码
// 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 目前也不支持,但由于其使用场景极为罕见,因此影响不大。

示例

rust 复制代码
// 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");
}
cpp 复制代码
// 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++");
}
相关推荐
qq_433554541 天前
C++ Dijkstra堆优化算法
开发语言·c++·算法
UrSpecial1 天前
Linux线程同步与互斥
linux·开发语言·c++
楼田莉子1 天前
C++动态规划算法:斐波那契数列模型
c++·学习·算法·动态规划
Madison-No71 天前
【C++】日期类运算符重载实战
c++·算法
椰子今天很可爱1 天前
线程分离和线程同步互斥
linux·c++
小柯J桑_1 天前
Linux:线程控制
linux·c++·算法
1白天的黑夜11 天前
栈-1047.删除字符串中的所有相邻重复项-力扣(LeetCode)
c++·leetcode·
旭意1 天前
C++微基础蓝桥杯之旅9.9-9.12
c++·算法·蓝桥杯
溟洵1 天前
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)
c语言·c++·算法
打不了嗝 ᥬ᭄1 天前
【Linux】线程同步与互斥
linux·服务器·c++