为什么不允许std :: variant与其中一种替代类型进行比较?

问题描述 投票:7回答:3

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

c++ c++17 std-variant
3个回答
1
投票

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

好吧,不是很随意。重点是你有一个严格的比较尺度*,点数如下:

  • 最严格的:只有变体可以相互相等,并且它们需要在替代序列(即类型),实际替代(索引,真的,因为你可以有多个相同类型的替代品)和价值。
  • 不太严格:变体替代品的平等,作为类型和价值,但不是替代品序列,也不是该序列中的指数(因此相同类型的两个不同替代品中的相同值将相等) )。
  • 最放松:活跃替代品中价值的平等,如果相关,则隐含转换其中一个元素。

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

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


8
投票

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

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

因此,std::variant<int, int>index() 0相比不等于std::variant<int, int>index() 1,尽管活跃的变体替代品具有相同的类型和相同的值。

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


2
投票

我不能回答问题的部分原因,但是因为你认为将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);
    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;
}
© www.soinside.com 2019 - 2024. All rights reserved.