【问题标题】:Verbosity of std::optional [duplicate]std::optional 的详细程度 [重复]
【发布时间】:2020-09-11 11:50:09
【问题描述】:

这是我的代码中的一个示例,使用std::optional

Max = index(summary_max.value(), clusters[summary_max.value()]->Maximum().value());

这里,summary_maxMaximum()std::optional。这太冗长了。 我只想输入index(summary_max, clusters[summary_max]->Maximum());

为什么std::optional<T> 不支持隐式转换为T?有什么有效的、不可避免的理由吗?

【问题讨论】:

  • 然后使用*summary_max
  • @PiotrSkotnicki 很好,我今天学到了一些东西
  • 你有没有考虑过过度使用optional

标签: c++ c++17


【解决方案1】:

如果您确定您的可选对象确实有值,您可以使用operator* operator function 代替value() 成员函数:

Max = index(*summary_max, 
            *(clusters[*summary_max]->Maximum()));
// rant: looks more like C than C++ to me.

但由于您两次使用 summary_max 的存储值,您可能只想在 index(...) 调用中使用它之前提取(复制/常量引用)。

const auto& max_index = summary_max.value();
Max = index(max_index, *(clusters[max_index]->Maximum()));

【讨论】:

  • 是的 - const auto& val = *summary_max; Max = index(val, clusters[val]->Maximum());
【解决方案2】:

为什么 std::optional 不支持隐式 [转换] 到 T?有什么有效的、不可避免的理由吗?

不可能! T 的存在是可选的。如果没有一组,隐式转换应该做什么?产生一个默认构造的T?这甚至不总是可能的。

因此,该库让您决定应该发生什么,这可以通过 value() 或简单地取消引用来完成(如果您确定存在 一个值)。

但是这种技术没有必要非常冗长:

const auto& val         = summary_max.value();
const auto& cluster_max = clusters[val]->Maximum().value();

Max = index(val, cluster_max);

顺便说一句,“强制转换”意味着“显式转换”,因此不存在“隐式强制转换”之类的东西。 ;)

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2012-03-08
    • 2018-09-15
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多