c++ Expected用法

发布时间:2026/7/7 2:16:46
c++ Expected用法 std::expected用于处理“可能失败的操作”表示一个操作要么成功并返回一个值要么失败并返回一个错误信息。结合了类型安全和错误处理的优点可以替代传统错误码和异常。测试下#include expected // 返回成功时的 int或失败时的 std::string 错误信息 static std::expectedint, std::string divide(int a, int b) { if (b 0) { return std::unexpected(Division by zero); } return a / b; } void testExpected(void) { auto result divide(10, 0); // 判断是否有值 if (result.has_value()) { // 可简写为 if (result) std::cout 10 / 0 , Result: result.value() \n; } else { // 获取具体的错误信息 std::cout Error: result.error() \n; } // 提供默认值 int val result.value_or(0); std::cout val: val std::endl; }运行ok. 还支持链式调用比较方便。再测试下模拟登录// 模拟用户 struct User { std::string name; std::string password; }; // 步骤 1: 查找用户 static std::expectedUser, std::string find_user(const std::string username) { if (username admin) { return User{admin, 123456}; } return std::unexpected(User not found: username); } // 步骤 2: 验证密码 static std::expectedUser, std::string validate_password(const User user, const std::string pwd) { if (user.password pwd) { return user; // 验证通过返回用户 } return std::unexpected(Invalid password for user: user.name); } // 步骤 3: 生成 Token (使用 transform 进行值的转换) static std::expectedstd::string, std::string generate_token(const User user) { return Token_ user.name _abc123; } // 测试链式调用 static void test_chained_login(const std::string username, const std::string pwd) { std::cout --- Testing login for: username --- std::endl; auto result find_user(username) .and_then([pwd](const User user) { // and_then的参数是一个Lambda 表达式 return validate_password(user, pwd); }) // 这里还可以加or_else处理失败场景试着抢救一下错误。 .transform([](const User user) { // transform 的 lambda 直接返回普通值而不是 expected return Token_ user.name _abc123; }); // 统一处理最终结果 if (result) { std::cout Login Success! Token: result.value() \n; } else { std::cout Login Failed! Error: result.error() \n; } } void testExpected2(void) { test_chained_login(admin, 123456); test_chained_login(guest, 123456); test_chained_login(admin, wrong); }运行ok . 想修改下demo测试下调用or_else。 如果校验密码不通过但发现对方是女生则让她通过。user加一个性别字段struct User { std::string name; std::string password; std::string gender; // male 或 female };修改find_user 假设admin用户是女生static std::expectedUser, std::string find_user(const std::string username) { if (username admin) { return User{admin, 123456, female}; } return std::unexpected(User not found: username); }修改执行流程加上密码校验失败时的or_else处理static void test_chained_login2(const std::string username, const std::string pwd) { std::cout --- Testing login for: username --- std::endl; // 1. 先拿到 find_user 的结果 auto user_result find_user(username); // 2. 开始链式调用 auto result user_result .and_then([](const User user) { return validate_password(user, pwd); }) .or_else([](const std::string err) - std::expectedUser, std::string { // 注意这个lambda表达式需要显式指定返回值类型否则推导失败报错inconsistent types std::expectedUser, std::__cxx11::basic_stringchar and std::unexpectedstd::__cxx11::basic_stringchar deduced for lambda return type std::cout 密码校验失败触发 or_else 抢救机制...\n; if (user_result.has_value() user_result-gender female) { std::cout 发现是女生热烈欢迎\n; return std::expectedUser, std::string(user_result.value()); } std::cout 不是女生继续拦截。\n; return std::unexpectedstd::string(err); }) .transform([](const User user) { return Token_ user.name _abc123; }); if (result) { std::cout Login Success! Token: result.value() \n\n; } else { std::cout Login Failed! Error: result.error() \n\n; } } void testExpected2(void) { // test_chained_login(admin, 123456); // test_chained_login(guest, 123456); // test_chained_login(admin, wrong); test_chained_login2(admin, mimi); }测试ok.