您如何定义具有异构值类型的 QHash?
Posted
技术标签:
【中文标题】您如何定义具有异构值类型的 QHash?【英文标题】:How do you define a QHash with heterogeneous value types? 【发布时间】:2014-08-19 00:17:34 【问题描述】:我需要有一个QHash
容器,它接受quint8
键但将异构类型作为值,所有这些都是Qt 容器或类。例如,我可能想插入一个QDate
或QTime
对象,甚至quint8
作为值。
如何定义这样的类型,以便在其他类中使用它并在运行时适当地填充?我希望能够将其作为全局类型访问。有可能吗?
注意问题已被编辑以更好地反映 OP 的意图。修改前写的答案适用于原始问题。
【问题讨论】:
你想要一个QHash<quint8, QVariant>
,与模板无关。
@Oktalist 我希望你把它写成答案。
我回答了你想问的问题,而不是你实际问的问题。 :)
@Oktalist 问题及其描述已开放编辑:)。在我最初的描述中,我为我的英语道歉并且未能准确描述问题。你刚才提到的是我的预期问题。请编辑问题及其描述以反映这一点。
【参考方案1】:
QVariant
是一种可以存储多种值类型中的任何一种的类型,在运行时确定,因此QHash<quint8, QVariant>
是您想要的。
有关一般模式,另请参阅 https://en.wikipedia.org/wiki/Tagged_union。
【讨论】:
【参考方案2】:最简单的方法是从QHash
继承并提供一个自己的模板参数:
template <typename T>
class MyHash : public QHash<quint8, T> ;
例子:
int main(int argc, char *argv[])
MyHash<QDate> testHash;
quint8 testKey = 123;
QDate testDate;
testHash.insert(testKey, testDate);
MyHash<QDate> testHash2(testHash);
qDebug() << testHash2.value(testKey); // outputs 'QDate("")'
关于这个 typedef 的位置,如果你不知道完整的项目,很难回答。 只需将定义放在您认为最合适的头文件中即可。问问自己,整个项目是否真的需要这个定义,或者只是几个文件。如果你例如有一个数据层,只有你的数据类应该直接在他们的头文件中包含那个文件。一旦其他类包含您的数据类标头之一,它们就会自动知道它。
如果您项目中的每个类都需要使用它,您可以将它放在项目根目录中的现有或新定义文件中,然后
在您的预编译头文件中包含该文件(如果您正在使用该文件),或者 检查您的编译器是否支持“强制包含”选项。【讨论】:
实际上我想在我的类中实例化一个对象,而不必在 括号中指定类型。只是创建一个对象。有可能吗?以上是关于您如何定义具有异构值类型的 QHash?的主要内容,如果未能解决你的问题,请参考以下文章