假设我有如下定义/声明:
struct Y {
std::string ToString() const { return "Yes"; }
};
std::optional<Y> bar;
X foo(Y y);
现在我想用foo
呼叫Y::ToString
(或bar.value()
),但显然只有bar.has_value()
当然,我懒得写这样的东西:
std::optional<X> fuzz = bar.has_value() ? foo(bar.value()) : std::nullopt;
std::string str_x = bar.has_value() ? bar.value().ToString() : "No";
相反,我想写:
std::optional<X> fuzz = std::visit(foo, bar);
std::optional<std::string> str_x = bar->ToString(); // obviously I can write this, but that's not the intent. Consider the line below:
string str_x = bar->ToString().value_or("No");
问题:
为什么它不在std :: optional API中?没有这种功能的样板(想象一下foo
如果有更多参数,示例的样子)会让我质疑使用std :: optional的好处。我缺少任何解决方法吗?
随机考虑全局函数(尽管不知道该如何处理成员函数):
template <typename Visitor, typename T>
auto visit(Visitor&& v, std::optional<T>&& opt) -> std::optional<decltype(v(opt.value()))> {
if (opt) {
return std::make_optional(v(std::forward(opt).value()));
}
return std::nullopt;
}