例如,将 astd::variant<T1, T2>
与 a进行相等比较应该是非常有帮助的T1
or T2
。到目前为止,我们只能与相同的变体类型进行比较。
问问题
3248 次
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_alternative
和std::get<T>
)自由设计自己的比较运算符重载。
于 2019-03-20T18:25:43.137 回答
4
我无法回答问题的部分原因,但既然您认为能够将 astd::variant<T1, T2>
与 a进行比较会很有用T1
or 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 回答