C ++中的QVariant相当于什么?

时间:2014-12-22 14:09:53

标签: c++ qt stl qtcore qvariant

我正在尝试使用STL将Qt应用程序移植到C ++。 C ++中QVariant的等价物是什么? QVariant可以存储任何数据类型 - 一个容纳异类的容器 - 不同类型的对象。但是,我必须将此应用程序移植到C ++。 C ++中QVariant的等价物是什么?

2 个答案:

答案 0 :(得分:13)

  

C ++中QVariant的等价物是什么?

C ++中的等价物称为 QVariant

除了半开玩笑,它可能是最接近联盟的,但QVariant远不止于此;元类型,CoW等。

实际上,这些天在STL中禁止隐含共享,所以这就是为什么你不会发现这样的副作用的另一个原因。

我建议您自己记下QVariant所需的功能,并判断是否真的值得删除QtCore。

这只是documentation的友情提醒:

  

QVariant类就像最常见的Qt数据类型的联合一样。

     

因为C ++禁止联合包含具有非默认构造函数或析构函数的类型,所以大多数有趣的Qt类不能在联合中使用。如果没有QVariant,这对于QObject :: property()和数据库工作等都是一个问题。

但是,由于允许使用带有构造函数和析构函数的C ++ 11类型。你有另外一个问题要问自己:

  

我是否想支持Qt所做的一切,或者我是否乐意至少要求C ++ 11?

公平地说,您还可以查看下面的以下提升变体,但最终在移植后最终使用boost而不是QtCore。

这是对自己的另一个判断。它们不是技术上的替代品,也不是兼容性。

在这种情况下,Boost是构建时依赖性,而QtCore是运行时。 Qt将保证在同一主要版本的生命周期内的二进制(和源)兼容性,而在QtCore这么长的时间内,boost可能不会做同样的事情。

无论哪种方式,这些选项都不是纯粹的STL解决方案,在我认为你想要它的方式结束时。

答案 1 :(得分:3)

从C ++ 17开始,有std::any(可能包含任何类型的值)和std::variant(可能包含任何给定类型的值)。这些将在GCC 7,Clang 4.0和Visual C ++ 2017中开箱即用。

这些都不完全等效(例如,它们不支持转换内部值),但它们可以让您完成QVariant所做的大部分操作。