您如何定义具有异构值类型的 QHash?

Posted

技术标签:

【中文标题】您如何定义具有异构值类型的 QHash?【英文标题】:How do you define a QHash with heterogeneous value types? 【发布时间】:2014-08-19 00:17:34 【问题描述】:

我需要有一个QHash 容器,它接受quint8 键但将异构类型作为值,所有这些都是Qt 容器或类。例如,我可能想插入一个QDateQTime 对象,甚至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?的主要内容,如果未能解决你的问题,请参考以下文章

QSet使用及Qt自定义类型使用QHash等算法

您如何建议合并具有相同属性但值类型不同的接口

Qt ------- QMap和QHash的区别

QMap 与 QHash

模型数据库中的异构类型

您如何定义具有键字符串索引但具有特定类型的已知键的 TypeScript 接口?