例如,将一个std::variant<T1, T2>与一个T1或T2进行相等比较应该是非常有帮助的,到目前为止我们只能与相同的变体类型进行比较。
std::variant<T1, T2>
T1
T2
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_alternative和std::get<T>)自由设计自己的比较操作符重载。
std::variant<int, int>
std::variant
index()
T
<variant>
std::holds_alternative
std::get<T>
rjzwgtxy2#
我无法回答这个问题的“为什么”部分,但既然您认为将std::variant<T1, T2>与T1或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); 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; }
qnakjoqk3#
这是标准委员会的武断决定。好吧,不是很武断。关键是你有一个严格的比较尺度,比如:
这些都是有效的选择。C++委员会基于各种外在的标准做出了决定。试着查找std::variant提案,因为它可能会说这些标准是什么。(*)-实际上是一个格。
3条答案
按热度按时间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_alternative
和std::get<T>
)自由设计自己的比较操作符重载。rjzwgtxy2#
我无法回答这个问题的“为什么”部分,但既然您认为将
std::variant<T1, T2>
与T1
或T2
进行比较会很有用,那么以下内容可能会有所帮助:qnakjoqk3#
这是标准委员会的武断决定。
好吧,不是很武断。关键是你有一个严格的比较尺度,比如:
这些都是有效的选择。C++委员会基于各种外在的标准做出了决定。试着查找
std::variant
提案,因为它可能会说这些标准是什么。(*)-实际上是一个格。