c++ 为什么不允许std::variant与它的一个替代类型进行相等比较?

vc6uscn9  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(204)

例如,将一个std::variant<T1, T2>与一个T1T2进行相等比较应该是非常有帮助的,到目前为止我们只能与相同的变体类型进行比较。

4ioopgfo

4ioopgfo1#

一个变量可以有多个相同类型的副本。例如std::variant<int, int>
当且仅当std::variant的给定示例与另一个示例具有相同的变体备选项并且所述备选项的值比较相等时,std::variant的给定示例比较相等。
因此,具有index() 0的std::variant<int, int>比较起来不等于具有index() 1的std::variant<int, int>,尽管活动变体替换具有相同类型和相同值。
因此,标准没有实现通用的“与T比较“。但是,您可以使用<variant>头文件中的其他帮助实用程序(例如std::holds_alternativestd::get<T>)自由设计自己的比较操作符重载。

rjzwgtxy

rjzwgtxy2#

我无法回答这个问题的“为什么”部分,但既然您认为将std::variant<T1, T2>T1T2进行比较会很有用,那么以下内容可能会有所帮助:

template<typename T, class... Types>
inline bool operator==(const T& t, const std::variant<Types...>& v) {
    const T* c = std::get_if<T>(&v);

    return c && *c == t; // true if v contains a T that compares equal to t
}

template<typename T, class... Types>
inline bool operator==(const std::variant<Types...>& v, const T& t) {
    return t == v;
}
qnakjoqk

qnakjoqk3#

这是标准委员会的武断决定。
好吧,不是很武断。关键是你有一个严格的比较尺度,比如:

  • 最严格:只有变量可以彼此相等,并且它们需要在替代序列(即类型)、实际替代(实际上是索引,因为可以有多个相同类型的替代)和值方面都匹配。
  • 不太严格:变量选择项作为类型和值的相等性,但不等于选择项序列,也不等于该序列中的索引(因此相同类型的两个不同选择项中的相同值将相等)。
  • 最放松:活动替代项中的值相等,如果相关,则隐式转换其中一个元素。

这些都是有效的选择。C++委员会基于各种外在的标准做出了决定。试着查找std::variant提案,因为它可能会说这些标准是什么。
(*)-实际上是一个格。

相关问题