用std :: optional调用函数

时间:2019-02-07 06:03:21

标签: c++ c++17 optional

假设我有如下定义/声明:

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;
}

0 个答案:

没有答案