我有QSet<QString>,我把它存储在QVariant中,然后尝试将它与一个相同的对象进行比较。虽然QSet<QString>比较有效,但当它们被包装在QVariant中时,情况就不再是这样了。有什么想法或解决办法吗?我需要比较单元测试中的QVariant和QCOMPARE()
QSet<QString> s1({"str"});
QSet<QString> s2({"str"});
QVariant v1;
QVariant v2;
v1.setValue(s1);
v2.setValue(s2);
qDebug() << QString::number(v1 == v2); // 0
qDebug() << QString::number(s1 == s2); // 1
qDebug() << QString::number(s1.value<QSet<QString>>() == s2.value<QSet<QString>>()); // 1发布于 2020-04-06 20:30:00
这是可以工作的,但事实证明,有一些体力劳动要做。从QVariant::operator== documentation..。
警告:要使该函数与在qRegisterMetaType()中注册的自定义类型一起工作,其比较运算符必须使用QMetaType::寄存器比较器()进行注册
尽管在这种情况下还没有使用qRegisterMetaType(),但似乎仍然需要调用QMetaType::registerComparators()。它的documentation进一步声明对于类型T,对QMetaType::registerComparators<T>() "...requires T to have both an operator== and an operator<"的成功调用。在本例中,QSet已经有一个相等运算符,但没有operator<,因此需要实现它。把这些碎片放在一起.
#include <iostream>
#include <QSet>
#include <QString>
#include <QVariant>
template<typename T>
bool operator< (const QSet<T> &a, const QSet<T> &b)
{
auto ia = a.begin();
auto ib = b.begin();
while (true) {
if (ia == a.end() || ib == b.end())
return a.size() < b.size();
if (*ia < *ib)
return true;
++ia;
++ib;
}
return false;
}
int main ()
{
QMetaType::registerComparators<QSet<QString>>();
QSet<QString> s1({"str"});
QSet<QString> s2({"str"});
QVariant v1;
QVariant v2;
v1.setValue(s1);
v2.setValue(s2);
std::cout << (v1 == v2) << "\n";
std::cout << (s1 == s2) << "\n";
std::cout << (v1.value<QSet<QString>>() == v2.value<QSet<QString>>()) << "\n";
}基本测试给出输出..。
1
1
1https://stackoverflow.com/questions/61066802
复制相似问题