Console Library 8.0.0
A header-only library that makes C++ simple
Loading...
Searching...
No Matches
console::Result< T, E > Class Template Reference

表示可能成功或失败的结果,类似于 Rust 的 Result 类型。 More...

#include <result.h>

Public Types

typedef T value_type
 成功值类型别名。
typedef E error_type
 错误值类型别名。

Public Member Functions

 Result (const T &value)
 从成功值构造 Result(拷贝)。
 Result (const E &error)
 从错误值构造 Result(拷贝)。
 Result (T &&value)
 从成功值构造 Result(移动)。
 Result (E &&error)
 从错误值构造 Result(移动)。
 Result (const Result &other)
 拷贝构造,深拷贝内部值。
 Result (Result &&other) noexcept
 移动构造,转移内部值。
Result & operator= (const Result &other)
 拷贝赋值(使用 copy-and-swap 惯用法)。
Result & operator= (Result &&other) noexcept
 移动赋值(使用 copy-and-swap 惯用法)。
 ~Result ()
 析构函数,正确销毁当前存储的值。
T ok () const &
 获取成功值的副本(左值引用版本)。
E err () const &
 获取错误值的副本(左值引用版本)。
T ok () &&
 移动获取成功值(右值引用版本)。
E err () &&
 移动获取错误值(右值引用版本)。
T unwrap () const
 解包成功值,若为错误则抛出异常。
T expect (const std::string &msg) const
 带自定义消息的解包,若为错误则抛出异常。
bool is_ok () const
 检查是否为 Ok(成功)状态。
bool is_err () const
 检查是否为 Err(错误)状态。
template<class F, class G>
void visit (F &&f, G &&g) const
 访问 Result 的内容,根据状态调用不同的函数。
template<class F>
auto and_then (F &&f) const &-> Result< typename std::decay< decltype(f(std::declval< T >()))>::type::value_type, E >
 链式操作:若为 Ok 则应用 f,否则传递 Err(左值引用版本)。
template<class F>
auto and_then (F &&f) &&-> Result< typename std::decay< decltype(f(std::declval< T >()))>::type::value_type, E >
 链式操作:若为 Ok 则应用 f,否则传递 Err(右值引用版本)。
template<class F>
auto or_else (F &&f) const &-> Result< T, typename std::decay< decltype(f(std::declval< E >()))>::type::error_type >
 链式操作:若为 Err 则应用 f,否则传递 Ok(左值引用版本)。
template<class F>
auto or_else (F &&f) &&-> Result< T, typename std::decay< decltype(f(std::declval< E >()))>::type::error_type >
 链式操作:若为 Err 则应用 f,否则传递 Ok(右值引用版本)。
void swap (Result &other) noexcept
 交换两个 Result 的内容。
 operator bool () const
 布尔转换,检查是否为 Ok。
bool operator! () const
 逻辑非,检查是否为 Err。
const T & unwrap_or (const T &default_value) const &
 如果是Ok则返回值的引用,否则返回默认值的引用。
T unwrap_or (T &&default_value) &&
 如果是Ok则移动返回值,否则返回默认值。
template<class F>
T unwrap_or_else (F &&fn) const &
 如果是Ok则返回Ok值,否则通过函数生成默认值。
template<class F>
T unwrap_or_else (F &&fn) &&
 如果是Ok则移动返回值,否则通过函数生成默认值。
const T * ok_ptr () const
 获取Ok值的指针(可能为空)。
T * ok_ptr ()
 获取Ok值的指针(可能为空)。
const E * err_ptr () const
 获取Err值的指针(可能为空)。
E * err_ptr ()
 获取Err值的指针(可能为空)。
bool operator== (const Result &other) const
 相等性比较。
bool operator!= (const Result &other) const
 不等性比较。

Private Member Functions

T * get_ok_ptr () const
 获取指向成功值 T 的指针(常量)。
E * get_err_ptr () const
 获取指向错误值 E 的指针(常量)。

Private Attributes

unsigned char buffer [buffer_size]
 对齐的原始字节缓冲区,用于存储 T 或 E。
bool is_ok_
 标记当前是否为 Ok 状态(true 表示 Ok,false 表示 Err)。

Static Private Attributes

static constexpr size_t buffer_size = sizeof(T) > sizeof(E) ? sizeof(T) : sizeof(E)
 缓冲区大小,取 T 和 E 中较大者。
static constexpr size_t buffer_align = alignof(T) > alignof(E) ? alignof(T) : alignof(E)
 缓冲区对齐要求,取 T 和 E 中较大者。

Friends

void swap (Result &a, Result &b) noexcept
 交换两个 Result 的内容(友元函数)。

Detailed Description

template<class T, class E>
class console::Result< T, E >

表示可能成功或失败的结果,类似于 Rust 的 Result 类型。

Template Parameters
T成功值的类型。
E错误值的类型。

Result 要么包含一个 T 类型的成功值(Ok),要么包含一个 E 类型的错误值(Err)。使用对齐的字节缓冲区存储两者之一, 避免了额外的堆分配。访问错误状态的成功值会抛出异常。

Member Typedef Documentation

◆ error_type

template<class T, class E>
typedef E console::Result< T, E >::error_type

错误值类型别名。

◆ value_type

template<class T, class E>
typedef T console::Result< T, E >::value_type

成功值类型别名。

Constructor & Destructor Documentation

◆ Result() [1/6]

template<class T, class E>
console::Result< T, E >::Result ( const T & value)
inline

从成功值构造 Result(拷贝)。

Parameters
value成功值。

◆ Result() [2/6]

template<class T, class E>
console::Result< T, E >::Result ( const E & error)
inline

从错误值构造 Result(拷贝)。

Parameters
error错误值。

◆ Result() [3/6]

template<class T, class E>
console::Result< T, E >::Result ( T && value)
inline

从成功值构造 Result(移动)。

Parameters
value成功值右值。

◆ Result() [4/6]

template<class T, class E>
console::Result< T, E >::Result ( E && error)
inline

从错误值构造 Result(移动)。

Parameters
error错误值右值。

◆ Result() [5/6]

template<class T, class E>
console::Result< T, E >::Result ( const Result< T, E > & other)
inline

拷贝构造,深拷贝内部值。

Parameters
other源 Result。
Note
根据 other 的状态拷贝对应的 T 或 E。

◆ Result() [6/6]

template<class T, class E>
console::Result< T, E >::Result ( Result< T, E > && other)
inlinenoexcept

移动构造,转移内部值。

Parameters
other源 Result,移动后仍保持原状态(值被移动)。

◆ ~Result()

template<class T, class E>
console::Result< T, E >::~Result ( )
inline

析构函数,正确销毁当前存储的值。

Member Function Documentation

◆ and_then() [1/2]

template<class T, class E>
template<class F>
auto console::Result< T, E >::and_then ( F && f) && -> Result< typename std::decay< decltype(f( std::declval< T >()))>::type::value_type, E >
inline

链式操作:若为 Ok 则应用 f,否则传递 Err(右值引用版本)。

Template Parameters
F映射函数类型,接受 T 返回 Result<U, E>。
Parameters
f应用到成功值的函数。
Returns
Result<U, E> f 返回的结果,或移动的 Err。

◆ and_then() [2/2]

template<class T, class E>
template<class F>
auto console::Result< T, E >::and_then ( F && f) const & -> Result< typename std::decay< decltype(f( std::declval< T >()))>::type::value_type, E >
inline

链式操作:若为 Ok 则应用 f,否则传递 Err(左值引用版本)。

Template Parameters
F映射函数类型,接受 T 返回 Result<U, E>。
Parameters
f应用到成功值的函数。
Returns
Result<U, E> f 返回的结果,或当前的 Err。

◆ err() [1/2]

template<class T, class E>
E console::Result< T, E >::err ( ) &&
inline

移动获取错误值(右值引用版本)。

Returns
E 错误值的右值引用。
Note
仅当 is_err() 为 true 时调用, 否则触发 assert (DEBUG) 或未定义行为 (RELEASE)。

◆ err() [2/2]

template<class T, class E>
E console::Result< T, E >::err ( ) const &
inline

获取错误值的副本(左值引用版本)。

Returns
E 错误值的副本。
Note
仅当 is_err() 为 true 时调用, 否则触发 assert (DEBUG) 或未定义行为 (RELEASE)。

◆ err_ptr() [1/2]

template<class T, class E>
E * console::Result< T, E >::err_ptr ( )
inline

获取Err值的指针(可能为空)。

Returns
E* 指向Err值的指针,如果是Ok则返回nullptr。

◆ err_ptr() [2/2]

template<class T, class E>
const E * console::Result< T, E >::err_ptr ( ) const
inline

获取Err值的指针(可能为空)。

Returns
const E* 指向Err值的指针,如果是Ok则返回nullptr。

◆ expect()

template<class T, class E>
T console::Result< T, E >::expect ( const std::string & msg) const
inline

带自定义消息的解包,若为错误则抛出异常。

Parameters
msg异常消息。
Returns
T 成功值的副本。
Exceptions
ValueError若 Result 为 Err 状态,携带 msg。
Note
相当于 Rust 的 expect()。

◆ get_err_ptr()

template<class T, class E>
E * console::Result< T, E >::get_err_ptr ( ) const
inlineprivate

获取指向错误值 E 的指针(常量)。

◆ get_ok_ptr()

template<class T, class E>
T * console::Result< T, E >::get_ok_ptr ( ) const
inlineprivate

获取指向成功值 T 的指针(常量)。

◆ is_err()

template<class T, class E>
bool console::Result< T, E >::is_err ( ) const
inline

检查是否为 Err(错误)状态。

Returns
true 若为 Err,false 若为 Ok。

◆ is_ok()

template<class T, class E>
bool console::Result< T, E >::is_ok ( ) const
inline

检查是否为 Ok(成功)状态。

Returns
true 若为 Ok,false 若为 Err。

◆ ok() [1/2]

template<class T, class E>
T console::Result< T, E >::ok ( ) &&
inline

移动获取成功值(右值引用版本)。

Returns
T 成功值的右值引用。
Note
仅当 is_ok() 为 true 时调用, 否则触发 assert (DEBUG) 或未定义行为 (RELEASE)。

◆ ok() [2/2]

template<class T, class E>
T console::Result< T, E >::ok ( ) const &
inline

获取成功值的副本(左值引用版本)。

Returns
T 成功值的副本。
Note
仅当 is_ok() 为 true 时调用, 否则触发 assert (DEBUG) 或未定义行为 (RELEASE)。

◆ ok_ptr() [1/2]

template<class T, class E>
T * console::Result< T, E >::ok_ptr ( )
inline

获取Ok值的指针(可能为空)。

Returns
T* 指向Ok值的指针,如果是Err则返回nullptr。

◆ ok_ptr() [2/2]

template<class T, class E>
const T * console::Result< T, E >::ok_ptr ( ) const
inline

获取Ok值的指针(可能为空)。

Returns
const T* 指向Ok值的指针,如果是Err则返回nullptr。

◆ operator bool()

template<class T, class E>
console::Result< T, E >::operator bool ( ) const
inlineexplicit

布尔转换,检查是否为 Ok。

Returns
true 若为 Ok,false 若为 Err。

◆ operator!()

template<class T, class E>
bool console::Result< T, E >::operator! ( ) const
inline

逻辑非,检查是否为 Err。

Returns
true 若为 Err,false 若为 Ok。

◆ operator!=()

template<class T, class E>
bool console::Result< T, E >::operator!= ( const Result< T, E > & other) const
inline

不等性比较。

Returns
bool 两个Result对象是否不等。

◆ operator=() [1/2]

template<class T, class E>
Result & console::Result< T, E >::operator= ( const Result< T, E > & other)
inline

拷贝赋值(使用 copy-and-swap 惯用法)。

Parameters
other源 Result。
Returns
Result& *this。

◆ operator=() [2/2]

template<class T, class E>
Result & console::Result< T, E >::operator= ( Result< T, E > && other)
inlinenoexcept

移动赋值(使用 copy-and-swap 惯用法)。

Parameters
other源 Result。
Returns
Result& *this。

◆ operator==()

template<class T, class E>
bool console::Result< T, E >::operator== ( const Result< T, E > & other) const
inline

相等性比较。

Returns
bool 两个Result对象是否相等。

◆ or_else() [1/2]

template<class T, class E>
template<class F>
auto console::Result< T, E >::or_else ( F && f) && -> Result< T, typename std::decay< decltype(f( std::declval< E >()))>::type::error_type >
inline

链式操作:若为 Err 则应用 f,否则传递 Ok(右值引用版本)。

Template Parameters
F映射函数类型,接受 E 返回 Result<T, U>。
Parameters
f应用到错误值的函数。
Returns
Result<T, U> f 返回的结果,或移动的 Ok。
Note
与 Rust 的 or_else 语义不同,注意区分。

◆ or_else() [2/2]

template<class T, class E>
template<class F>
auto console::Result< T, E >::or_else ( F && f) const & -> Result< T, typename std::decay< decltype(f( std::declval< E >()))>::type::error_type >
inline

链式操作:若为 Err 则应用 f,否则传递 Ok(左值引用版本)。

Template Parameters
F映射函数类型,接受 E 返回 Result<T, U>。
Parameters
f应用到错误值的函数。
Returns
Result<T, U> f 返回的结果,或当前的 Ok。
Note
与 Rust 的 or_else 语义不同,注意区分。

◆ swap()

template<class T, class E>
void console::Result< T, E >::swap ( Result< T, E > & other)
inlinenoexcept

交换两个 Result 的内容。

Parameters
other要交换的 Result。

◆ unwrap()

template<class T, class E>
T console::Result< T, E >::unwrap ( ) const
inline

解包成功值,若为错误则抛出异常。

Returns
T 成功值的副本。
Exceptions
ValueError若 Result 为 Err 状态。
Note
相当于 Rust 的 unwrap()。

◆ unwrap_or() [1/2]

template<class T, class E>
const T & console::Result< T, E >::unwrap_or ( const T & default_value) const &
inline

如果是Ok则返回值的引用,否则返回默认值的引用。

Parameters
default_value默认值引用。
Returns
const T& 值的引用。

◆ unwrap_or() [2/2]

template<class T, class E>
T console::Result< T, E >::unwrap_or ( T && default_value) &&
inline

如果是Ok则移动返回值,否则返回默认值。

Parameters
default_value默认值。
Returns
T 值。

◆ unwrap_or_else() [1/2]

template<class T, class E>
template<class F>
T console::Result< T, E >::unwrap_or_else ( F && fn) &&
inline

如果是Ok则移动返回值,否则通过函数生成默认值。

Parameters
fn生成默认值的函数。
Returns
T 值。

◆ unwrap_or_else() [2/2]

template<class T, class E>
template<class F>
T console::Result< T, E >::unwrap_or_else ( F && fn) const &
inline

如果是Ok则返回Ok值,否则通过函数生成默认值。

Parameters
fn生成默认值的函数。
Returns
T 值。

◆ visit()

template<class T, class E>
template<class F, class G>
void console::Result< T, E >::visit ( F && f,
G && g ) const
inline

访问 Result 的内容,根据状态调用不同的函数。

Template Parameters
FOk 处理函数类型。
GErr 处理函数类型。
Parameters
f若为 Ok,用成功值调用 f。
g若为 Err,用错误值调用 g。

类似于模式匹配,根据状态分发到对应的处理函数。

◆ swap

template<class T, class E>
void swap ( Result< T, E > & a,
Result< T, E > & b )
friend

交换两个 Result 的内容(友元函数)。

Parameters
a第一个 Result。
b第二个 Result。

Member Data Documentation

◆ buffer

template<class T, class E>
unsigned char console::Result< T, E >::buffer[buffer_size]
mutableprivate

对齐的原始字节缓冲区,用于存储 T 或 E。

◆ buffer_align

template<class T, class E>
size_t console::Result< T, E >::buffer_align = alignof(T) > alignof(E) ? alignof(T) : alignof(E)
staticconstexprprivate

缓冲区对齐要求,取 T 和 E 中较大者。

◆ buffer_size

template<class T, class E>
size_t console::Result< T, E >::buffer_size = sizeof(T) > sizeof(E) ? sizeof(T) : sizeof(E)
staticconstexprprivate

缓冲区大小,取 T 和 E 中较大者。

◆ is_ok_

template<class T, class E>
bool console::Result< T, E >::is_ok_
private

标记当前是否为 Ok 状态(true 表示 Ok,false 表示 Err)。


The documentation for this class was generated from the following file: