如何在不编写标识样板的情况下访问 C++23 std::Optional 中包含的值?

NoS*_*tAl 8 c++ stdoptional c++23

我正在使用 C++23std::optional添加,但我不知道如何优雅地访问对象的值(如果optional处于活动状态)。

我知道我可以使用if,但这就是C ++20 。

我真的很喜欢 C++23 API 的变化,但我不知道如何跳过实现身份的样板。例如:

#include <functional>
#include <iostream>
#include <optional>

void print(std::optional<std::string>& name) {
    name.transform([](std::string& x) {
        std::cout << x << std::endl;
        // I just want to print, without modifying optional, but next line is required
        return x;
    });
}

int main() {
    std::optional<std::string> name{{"Bjarne"}};
    print(name);
}
Run Code Online (Sandbox Code Playgroud)

感觉就像std::optional缺少invoke会员功能一样。

注意:在我的示例中,我在转换后不会链接任何其他内容,但为了简洁起见,我关心可选内容是否被修改。

Nic*_*las 8

optionalC++23 中添加的操作本质上是一元的。这就是他们的设计。它们满足某些常见的使用模式,否则使用起来会很冗长和麻烦。transform用于条件转换。and_then用于有条件地处理现有选项中的全新选项。or_else适用于处理缺少值非常简单的情况。所有这些都一起工作以允许链接。

但是“如果可选值有价值就做某事”的基本行为不适合这个范式。它是不可链接的。这不是对值的一元操纵。这只是可选的正常使用。

这样做if不仅会更清楚正在发生的事情,而且噪音也会更少(例如,没有 lamdba 和参数)。当通常的机制很好时,没有理由这样做。