例如,将
std::variant<T1, T2>
与T1
或T2
进行等值比较应该非常有帮助。目前我们只能与相同的变体类型进行比较。std::variant<T1, T2>
与T1
或T2
进行等值比较应该非常有帮助。目前我们只能与相同的变体类型进行比较。变量可能有多个相同类型的副本。例如:std::variant<int, int>
。
如果一个 std::variant
实例持有相同的变体替代项并且这些替代项的值相等,则它与另一个实例相等。
因此,index()
为 0 的 std::variant<int, int>
与 index()
为 1 的 std::variant<int, int>
不相等,尽管活动的变体替代项是相同类型和相同值。
由于这个原因,标准没有实现通用的“与 T
比较”的功能。但是,您可以自由设计自己的比较运算符重载,使用其他辅助工具(例如 std::holds_alternative
和 std::get<T>
)在 <variant>
头文件中。
int
和 std::variant<int, int>
时,它可以将 活动 成员与该 int
进行比较。 - Maxim Egorushkinboost::variant
也不支持与其中一种备选类型的相等比较。 - Barryvariant<a,b,c>
总是 具有 b
作为替代 1,如果 var1 的替代品不是 var2 的替代品,它们永远不会相等。 如果你走了“好吧,我确定他们在说 variant<int, int, double>
时是指 variant<int, double>
”,那么就像 JavaScript 中的 "1"==1
那样荒谬。 如果您想进一步了解,请查阅类型理论中的“和类型”。 - Yakk - Adam Nevraumont我无法回答问题的“为什么”部分,但是既然您认为能够比较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;
}
std::variant<int, std::string>
以满足比较函数签名。对于int来说,这可能是微不足道的。但对于字符串来说,这可能意味着复制。 - Cruz Jean