首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QVariant持有QSet<QString>比较不像预期的那样工作,而裸QSet<QString>工作正常。

QVariant持有QSet<QString>比较不像预期的那样工作,而裸QSet<QString>工作正常。
EN

Stack Overflow用户
提问于 2020-04-06 18:45:22
回答 1查看 313关注 0票数 0

我有QSet<QString>,我把它存储在QVariant中,然后尝试将它与一个相同的对象进行比较。虽然QSet<QString>比较有效,但当它们被包装在QVariant中时,情况就不再是这样了。有什么想法或解决办法吗?我需要比较单元测试中的QVariantQCOMPARE()

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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<,因此需要实现它。把这些碎片放在一起.

代码语言:javascript
复制
#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";
}

基本测试给出输出..。

代码语言:javascript
复制
1
1
1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61066802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档