c++ - 有没有办法在不专门转换的情况下转换存储在 QVariant 中的基本类型?
问题描述
让我们考虑这个例子:
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
}
}
调试函数显示QVariant的内部存储类型:
QVariant(int, 1) QVariant(QString, "goofy")
有没有办法避免if
s 并进行显式转换以访问内部类型?更具体地说,为了获得我希望能够编写如下内容的值:
auto value = var.ToData();
编辑:由于 QVariant 可以容纳很多类型,并且您甚至可以在其上添加自定义类型,因此将问题仅限于基本类型(int、double、bool、string)就足够了
解决方案
不,这是不可能的。与任何其他变体一样,QVariant
基本上充当联合体。除非您知道数据的类型,否则您无法获取它。如果您的虚构代码auto value = var.ToData();
应该工作,则类型value
必须在编译时可解析 - 但它根本就不是变体。
变体的全部意义在于它使您能够将多种类型存储在一个值中,所有这些都在运行时完成。在内部,它存储了它的值的类型,但它是一个运行时值——所以如果你不知道确切的类型,除了进行长切换之外别无他法。
推荐阅读
- node.js - ReferenceError:初始化前无法访问“模型”
- c - extern 关键字似乎没有任何作用
- javascript - 如何使用键盘上的 Enter 键登录网站?
- c - 为什么 isalpha 只返回 1 或 0?
- reactjs - REACTJS tableBody.jsx 组件错误:对象作为 React 子项无效
- laravel - Vue中的输入事件在调用函数时执行了两次
- r - 带有动态标题的管道ggplot2
- apache-spark - 如何使用 Spark 定义 ORC 条带大小?
- javascript - 返回 HttpResponse 并在 PayPal 系统中进行响应
- powershell - Foreach 打印出整个数组