【CXX】6.1 String — rust::String
Rust::String 公共 API
// rust/cxx.h
class String final {
public:
String() noexcept;
String(const String &) noexcept;
String(String &&) noexcept;
~String() noexcept;
// 如果输入不是 UTF-8,抛出 std::invalid_argument 异常。
String(const std::string &);
String(const char *);
String(const char *, size_t);
String(const char8_t *);
String(const char8_t *, size_t);
// 用替换字符 (U+FFFD) 替换无效的 UTF-8 数据。
static String lossy(const std::string &) noexcept;
static String lossy(const char *) noexcept;
static String lossy(const char *, size_t) noexcept;
// 如果输入不是 UTF-16,抛出 std::invalid_argument 异常。
String(const char16_t *);
String(const char16_t *, size_t);
// 用替换字符 (U+FFFD) 替换无效的 UTF-16 数据。
static String lossy(const char16_t *) noexcept;
static String lossy(const char16_t *, size_t) noexcept;
String &operator=(const String &) & noexcept;
String &operator=(String &&) & 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;
const char *c_str() noexcept;
size_t capacity() const noexcept;
void reserve(size_t new_cap) noexcept;
using iterator = char *;
iterator begin() noexcept;
iterator end() noexcept;
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 String &) const noexcept;
bool operator!=(const String &) const noexcept;
bool operator<(const String &) const noexcept;
bool operator<=(const String &) const noexcept;
bool operator>(const String &) const noexcept;
bool operator>=(const String &) const noexcept;
void swap(String &) noexcept;
};
std::ostream &operator<<(std::ostream &, const String &);
限制
无。字符串可以作为函数参数和返回值,按值或按引用传递,也可以作为共享结构体的字段。
示例
// src/main.rs
#[cxx::bridge]
mod ffi {
struct ConcatRequest {
fst: String,
snd: String,
}
unsafe extern "C++" {
include!("example/include/concat.h");
fn concat(r: ConcatRequest) -> String;
}
}
fn main() {
let concatenated = ffi::concat(ffi::ConcatRequest {
fst: "fearless".to_owned(),
snd: "concurrency".to_owned(),
});
println!("concatenated: {:?}", concatenated);
}
// include/concat.h
#pragma once
#include "example/src/main.rs.h"
#include "rust/cxx.h"
rust::String concat(ConcatRequest r);
// src/concat.cc
#include "example/include/concat.h"
rust::String concat(ConcatRequest r) {
// rust::String 的完整运算符重载尚未添加,
// 但我们可以这样实现:
return std::string(r.fst) + std::string(r.snd);
}