C++ std::optional的用法(附带实例)
在传统的 C++ 编程中,我们常常使用指针、特殊返回值或者额外的状态检查来表示某个值的缺失(如使用 NULL 或 -1)。然而,这些方法要么不安全(如裸指针),要么不直观(如特殊值),也不具有类型安全性。
std::optional 通过封装一个可选的值和一个布尔类型的状态标志来解决这一问题,使得代码更加清晰且易于维护。
此外,std::optional 还支持
std::optional 通过封装一个可选的值和一个布尔类型的状态标志来解决这一问题,使得代码更加清晰且易于维护。
C++ optional的基础用法
std::optional<T> 是一个模板类型,内部存储一个类型为 T 的值,这个类型提供了丰富的接口。- has_value():这个函数用来检查 std::optional 对象是否包含一个值。如果对象内部存储了值,则返回 true;否则返回 false。
- value():当 std::optional 实例包含一个值时,这个函数返回存储的值的引用。如果调用 value() 时对象没有值,会抛出 std::bad_optional_access 异常。
- value_or(T&& default_value):这个函数提供一种安全的方式来获取存储的值或一个默认值。如果 std::optional 实例包含一个值,就返回这个值;否则,返回传递给 value_or 的默认值。
此外,std::optional 还支持
operator*
和 operator->
,用于直接访问存储的值(前提是存在这个值),这使得它的使用更加直观和方便。
#include <optional> #include <iostream> std::optional<int> get_even_number(int num) { if (num % 2 == 0) return num; return std::nullopt; // 返回一个空的 std::optional 对象 } int main() { auto result = get_even_number(3); if (result.has_value()) { std::cout << "Even number: " << result.value() << '\n'; } else { std::cout << "No even number provided.\n"; } }在这个示例中,get_even_number() 函数尝试返回一个偶数。如果输入的数是偶数,它就返回该数并封装在 std::optional 中;如果不是,就返回 std::nullopt,表示没有值。这使得函数的调用者可以明确知道何时没有有效的返回值,避免使用魔术数字或裸指针的风险。