是否有 QPair 类,但用于三个 + 项目而不是两个?

Is there a QPair class, but for three+ items instead of two?

提问人:Anon 提问时间:2/21/2016 更新时间:3/23/2022 访问量:10445

问:

QPair 很好,但如果我需要 3 件物品怎么办?我应该只做一个结构,还是Qt可以覆盖我?

C++ Qt 结构

评论

2赞 Thomas Matthews 2/21/2016
你需要一个“Q”结构还是可以使用?std::tuple
1赞 Anon 2/21/2016
我宁愿坚持 Q,但这也是一个不错的建议!
2赞 dtech 2/21/2016
结构有什么问题?
0赞 Anon 2/21/2016
这只是一个额外的步骤。
3赞 dtech 2/21/2016
@Akiva - 实际上它会更短 - 一个你可以直接在任何地方使用的结构,而每次你想使用它时都必须声明的元组,除非你 typedef 它,在这种情况下,它将与结构相同。

答:

5赞 Simply Me 2/21/2016 #1

您可以使用 创建自己的结构。上次我用这样的东西来实现你说的。Qpair<Qpair<item1, item2>, item3>

请注意,要使所有操作正常工作,您需要覆盖它们。第一项是组合项(item1+item2 对)。

评论

0赞 Anon 2/21/2016
我在想那个,但它很乱。点赞,但不被接受。
1赞 Simply Me 2/21/2016
实际上,这要视情况而定。您只需要覆盖操作并确保以正确的方式进行比较。我是从我的经验中这么说的。item1item2
1赞 BartoszKP 2/21/2016
@SimplyMe 即使使用元组也被认为是混乱的(因为它试图隐藏需要新类型的事实)。所以你对元组的模仿,这是对一种类型的模仿,确实是非常混乱的:)
1赞 Simply Me 2/21/2016
我知道,但这是一个很好的工作:)。您可以覆盖 2-3 个运算符,它实际上会以正常方式运行。
15赞 iksemyonov 2/21/2016 #2

正如 QTBUG-22441 所示,开发人员无意添加 的 Qt 模拟。(尽管 QTBUG-3283 给了我们希望它能够完成,但它的日期是 12 月 9 日,而带有 WONTFIX 的新报告日期是 5 月 15 日)。因此,您需要回退到或提出自己的数据结构。std::tuplestd::tuple

马克·穆茨(Marc Mutz)的名言:

无论如何,假设的 QTuple 不会做任何不同的事情,除了消耗 Qt 开发人员资源。

此外,Qt 5算法模块的文档明确指出了以下内容:

从历史上看,Qt曾经提供与许多STL算法函数直接等价的函数。从Qt 5.0开始,我们鼓励您直接使用STL中可用的实现;大多数Qt代码已被弃用(尽管它们仍然可用于保持旧代码的编译)。

因此,在使用Qt 5编程时,如果有必要的话,官方鼓励使用STL。

评论

0赞 Bernhard 9/11/2018
引用和链接只提到了 STL 算法,那么容器呢?
1赞 iksemyonov 9/14/2018
@Bernhard 请参阅 doc.qt.io/qt-5/containers.html。Qt容器和STL容器之间有一个关键的区别:Qt实现了隐式共享和写入时复制,而STL则没有(我认为两者都是设计使然)。现在,当涉及到C++11时,对于容器来说意味着移动语义,STL和Qt5容器都实现了这一点。另外,请查看此答案: stackoverflow.com/a/1668549/342384
1赞 Ronan Paixão 3/23/2022 #3

对于一些更简单的情况,您可以使用 或 ,前提是您仅使用 QVariant 支持的数据类型。QVector<QVariant>QList<QVariant>

文档中一个有趣的注释说:

QVariant 可以扩展为支持 Type 枚举中提到的类型以外的其他类型。有关详细信息,请参阅创建自定义 Qt 类型

第二个链接包括如何创建 QVariant 可存储的自定义类型。还有自定义类型示例