std ::可选的详细程度

问题描述

这是我的代码中使用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?有什么有效的,不可避免的理由吗?

解决方法

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

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

但是当您两次使用summary_max的存储值时,您可能只想提取(copy / const ref),然后再用于index(...)调用。

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

为什么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);

顺便说一句,“投射”的意思是“显式转换”,因此不存在“隐式转换”之类的东西。 ;)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...