我正在处理C++23 std::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成员函数。
注意:在我的示例中,在转换后我不链接任何其他内容,但为了简洁起见,我关心的是可选的不被修改。
发布于 2022-02-08 03:25:18
在optional中添加到C++23中的操作是一元性。这就是他们的设计。它们实现了某些常见的使用模式,否则使用起来会很繁琐。transform用于条件转换。and_then用于从现有的可选对象中有条件地处理一个全新的可选选项。or_else用于处理缺少值非常简单的情况。所有的人一起工作允许链子。
但是“如果可选项有价值的话做一些事情”这一基本行为并不符合这一范式。这可不是链子。这不是一元论的价值操纵。这只是正常使用一个可选的。
使用if不仅可以更清楚地了解所发生的事情,而且会减少噪音(例如,没有lamdba和参数)。当通常的机制很好的时候,就没有理由这么做了。
https://stackoverflow.com/questions/71025948
复制相似问题