问题描述
这是我的代码中使用std::optional
的示例:
Max = index(summary_max.value(),clusters[summary_max.value()]->Maximum().value());
此处,summary_max
和Maximum()
是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);
顺便说一句,“投射”的意思是“显式转换”,因此不存在“隐式转换”之类的东西。 ;)