7

我正在玩 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);
}

几乎感觉就像std::optional缺少invoke成员函数。

注意:在我的示例中,我在转换后没有链接其他任何东西,但为了简洁起见,我关心可选不被修改。

4

1 回答 1

5

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

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

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

于 2022-02-08T03:25:18.687 回答