楼主:
yam276 ('_')
2026-02-05 15:06:31※ 引述《Wardyal (满穗的小狗)》之铭言:
: 这排版我感觉可读性不太好
: 但是我把这些单行的 early return 都展开
: 又觉得可读性还是很烂
: 反而更丑了
: 哪个好啊
: ==
函数式流派:Monadic Operations (C++23 风格)
如果你们在讨论的是如何避免写 if,并且像生产线一样把函数串起来,那么 and_then (
类似 Rust 的 ? 或 flatMap) 就是答案。
这通常用于将错误往上抛,而不是吞掉错误变成 bool。
// 假设 func1, func2 都回传 Result<T, E>
return func1(...)
.and_then([&](auto val1) {
// 只有 func1 成功时才会进来
return func2(val1);
})
.and_then([&](auto val2) {
// 只有 func2 成功时才会进来
par = val2;
return Result<bool, Error>(true);
})
.or_else([&](const Error& err) {
// 只要上面任何一步出错,就会直接跳到这里 (Early Return 的变体)
spdlog::error("Error: {}", err.unwrap_str());
return Result<bool, Error>(false); // 或是把错误转换后往上抛
});
优点: 非常像 Rust 或 JavaScript Promise,完全没有 if,错误自动短路(Short-
circuiting)。
缺点: 这是“回传表达式”,对于单纯想赋值 (par = x) 的指令式代码来说,这样写反
而变复杂了,且 Debug 难度稍高。