【CXX】6.3 &[T], &mut [T] — rust::Slice<T>

rust::Slice, rust::Slice

复制代码
Rust 中的 &[T] 在 C++ 中写作 rust::Slice<const T>
Rust 中的 &mut [T] 在 C++ 中写作 rust::Slice<T>
公共 API:
cpp 复制代码
// rust/cxx.h

template <typename T>
class Slice final {
public:
using value_type = T;

Slice() noexcept;
Slice(const Slice<T> &) noexcept;
Slice(T *, size_t count) noexcept;

template <typename C>
explicit Slice(C &c) : Slice(c.data(), c.size());

Slice &operator=(Slice<T> &&) & noexcept;
Slice &operator=(const Slice<T> &) & noexcept
requires std::is_const_v<T>;

T *data() const noexcept;
size_t size() const noexcept;
size_t length() const noexcept;
bool empty() const noexcept;

T &operator[](size_t n) const noexcept;
T &at(size_t n) const;
T &front() const noexcept;
T &back() const noexcept;

class iterator;
iterator begin() const noexcept;
iterator end() const noexcept;

void swap(Slice &) noexcept;
};
限制:

T 不能是不透明的 Rust 类型或不透明的 C++ 类型。对不透明 Rust 类型的切片支持即将推出。

允许作为函数参数或返回值。不支持在共享结构体中使用。

只有 rust::Slice 是可复制赋值的,rust::Slice 则不行。(两者都是可移动赋值的。)你需要偶尔写 std::move 来提醒自己,意外地将重叠的 &mut [T] 暴露给 Rust 是未定义行为。

示例

这个示例是一个 C++ 程序,它构造了一个包含 JSON 数据的切片(通过从 stdin 读取,但也可以来自任何地方),然后调用 Rust 来通过 serde_json 和 serde_transcode 库将该 JSON 数据漂亮地打印到一个 std::string 中。

rust 复制代码
// src/main.rs

#![no_main] // main 定义在 C++ 的 main.cc 中

use cxx::CxxString;
use std::io::{self, Write};
use std::pin::Pin;

#[cxx::bridge]
mod ffi {
extern "Rust" {
fn prettify_json(input: &[u8], output: Pin<&mut CxxString>) -> Result<()>;
}
}

struct WriteToCxxString<'a>(Pin<&'a mut CxxString>);

impl<'a> Write for WriteToCxxString<'a> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.as_mut().push_bytes(buf);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}

fn prettify_json(input: &[u8], output: Pin<&mut CxxString>) -> serde_json::Result<()> {
let writer = WriteToCxxString(output);
let mut deserializer = serde_json::Deserializer::from_slice(input);
let mut serializer = serde_json::Serializer::pretty(writer);
serde_transcode::transcode(&mut deserializer, &mut serializer)
}
cpp 复制代码
// src/main.cc

#include "example/src/main.rs.h"
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

int main() {
// 从 stdin 读取 json。
std::istreambuf_iterator<char> begin{std::cin}, end;
std::vector<unsigned char> input{begin, end};
rust::Slice<const uint8_t> slice{input.data(), input.size()};

// 使用 serde_json 和 serde_transcode 进行漂亮打印。
std::string output;
prettify_json(slice, output);

// 写入 stdout。
std::cout << output << std::endl;
}
测试示例:
复制代码
$ echo '{"fearless":"concurrency"}' | cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running target/debug/example
{
"fearless": "concurrency"
}
相关推荐
fegggye4 小时前
PyO3 Class 详解 - 在 Python 中使用 Rust 类
pytorch·rust
云上漫步者11 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
想你依然心痛12 小时前
AI赋能编程语言挑战赛:从Python到Rust,我用AI大模型重塑开发效率
人工智能·python·rust
云上漫步者14 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——sys_locale完整适配案例
开发语言·后端·rust
勇敢牛牛_14 小时前
RustRover 2025.3 在WSL中GIT操作十分缓慢的问题
git·rust·rustrover
JPX-NO15 小时前
windows下编程IDE使用docker搭建的rust开发环境(Linux)
ide·windows·docker·rust
rocksun15 小时前
Rust 异步编程:Futures 与 Tokio 深度解析
数据库·rust
Chen--Xing15 小时前
LeetCode LCR 119.最长连续序列
c++·python·算法·leetcode·rust
Source.Liu17 小时前
【time-rs】解释://! Error that occurred at some stage of parsing(error/parse.rs)
rust·time
程序员大辉18 小时前
Rust使用IDE,除了vscode还有RustRover非商业用户可以免费使用
ide·vscode·rust