std::optional --- C++17
用来表示某个值是可选的,也就是说,这个值可能存在,也可能不存在。
std::optional
提供了一种类型安全的方式来避免使用像 nullptr
或特殊值这样的传统方法。
#include <iostream>
#include <optional>
std::optional<int> divide(int numerator, int denominator) {
if (denominator == 0) {
// 返回一个空的 std::optional 对象
return std::nullopt;
}
// 返回一个含有实际结果的 optional
return numerator / denominator;
}
int main() {
auto result = divide(10, 2);
if (result) { // 检查 result 是否有值
std::cout << "Result: " << *result << std::endl; // 使用 * 操作符访问值
} else {
std::cout << "Division by zero." << std::endl;
}
auto no_result = divide(10, 0);
std::cout << "Result available? " << no_result.has_value() << std::endl; // 使用 has_value() 检查是否有值
return 0;
}
使用 value_or
方法
在 std::optional
对象没有值时提供一个默认值,可以使用 value_or
方法。
#include <iostream>
#include <optional>
int main() {
std::optional<int> opt = std::nullopt;
// 如果 opt 没有值,返回默认值 100
std::cout << "Value or 100: " << opt.value_or(100) << std::endl;
opt = 200;
// 如果 opt 有值,返回 opt 的值
std::cout << "Value or 100: " << opt.value_or(100) << std::endl;
return 0;
}
错误处理
std::optional
可以用来优雅地处理错误情况,特别是在函数可能返回无效结果的情况下。
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> find_username(int user_id) {
if (user_id == 1) {
return "JohnDoe";
}
return std::nullopt;
}
int main() {
auto username = find_username(1);
if (username) {
std::cout << "Found username: " << *username << std::endl;
} else {
std::cout << "Username not found." << std::endl;
}
return 0;
}
Comments NOTHING