12

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

4

3 回答 3

10

一个变体可能有多个相同类型的副本。例如std::variant<int, int>

std::variant当且仅当它们具有相同的变体替代并且所述替代的值比较相等时,给定的比较等于另一个实例。

因此,std::variant<int, int>带0 的 a与带1index()的 a 比较不相等,尽管活动的变体备选方案具有相同的类型和相同的值。std::variant<int, int>index()

因此,T标准没有实现通用的“比较”。<variant>但是,您可以使用标头中的其他辅助实用程序(例如std::holds_alternativestd::get<T>)自由设计自己的比较运算符重载。

于 2019-03-20T18:25:43.137 回答
4

我无法回答问题的部分原因,但既然您认为能够将 astd::variant<T1, T2>与 a进行比较会很有用T1or T2,也许这会有所帮助:

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

template<typename T, class... Types>
inline bool operator==(const std::variant<Types...>& v, const T& t) {
    return t == v;
}
于 2019-03-20T22:38:15.683 回答
2

这是标准委员会的任意决定。

好吧,不是随意。关键是你有一个严格的比较尺度*,例如:

  • 最严格:只有变体可以相互相等,并且它们需要在替代序列(即类型)、实际替代(实际上是索引,因为您可以有多个相同类型的替代)和在价值上。
  • Less-Strict:变体替代物作为类型和值的平等,但不是替代序列的平等,也不是该序列中的索引(因此相同类型的两个不同替代物中的相同值将相等)。
  • Most-relaxed:活动替代中的值相等,如果相关,则隐式转换元素之一。

这些都是有效的选择。C++ 委员会根据各种外部标准做出决定。尝试查找std::variant提案,因为它可能说明了这些标准是什么。

(*) - 实际上是一个格子。

于 2019-03-20T18:45:25.083 回答