有没有一种方法可以转换存储在 QVariant 中的基本类型而不专门进行转换?

Moi*_*oia 4 c++ qt qvariant c++14

让我们考虑这个例子:

QVariant v1(1);
QVariant v2("goofy");
QVariantList list;

list << v1 << v2;

for (const auto& var : list) {
   qdebug() << var;

   // nasty part
   if (var.type == QVariant::Int) {
      int value = var.toInt();

      // do something
   } else if (var.type == QVariant::QString) {
      QString value = var.toString();

      // do something
   }
}
Run Code Online (Sandbox Code Playgroud)

调试函数显示QVariant的内部存储类型:

QVariant(int, 1) QVariant(QString, "goofy") 
Run Code Online (Sandbox Code Playgroud)

有没有办法避免ifs 并进行显式转换以访问内部类型?更具体地说,为了获得价值,我希望能够编写如下内容:

auto value = var.ToData();
Run Code Online (Sandbox Code Playgroud)

编辑:由于 QVariant 可以容纳很多类型,您甚至可以在其上添加自定义类型,将问题仅限于基本类型(int、double、bool、string)就足够了

Jaa*_*a-c 5

不,这是不可能的。与任何其他变体一样,QVariant基本上充当联合。除非你知道数据的类型,否则你无法得到它。如果您的想象代码auto value = var.ToData();应该可以工作,那么类型value必须在编译时可解析 - 但它根本就不是变体。

变体的全部意义在于它使您能够在单个值中存储多种类型,所有这些都在运行时完成。在内部,它存储它的值的​​类型,但它是一个运行时值——所以如果你不知道确切的类型,除了进行长时间的切换之外别无他法。