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

我需要有一个QHash 容器,它接受quint8 键但将异构类型作为值,所有这些都是Qt 容器或类。例如,我可能想插入一个QDateQTime 对象,甚至quint8 作为值。

如何定义这样的类型,以便在其他类中使用它并在运行时适当地填充?我希望能够将其作为全局类型访问。有可能吗?

注意问题已被编辑以更好地反映 OP 的意图。修改前写的答案适用于原始问题。

【问题讨论】:

  • 你想要一个QHash<quint8, QVariant>,与模板无关。
  • @Oktalist 我希望你把它写成答案。
  • 我回答了你想问的问题,而不是你实际问的问题。 :)
  • @Oktalist 问题及其描述已开放编辑:)。在我最初的描述中,我为我的英语道歉并且未能准确描述问题。你刚才提到的是我的预期问题。请编辑问题及其描述以反映这一点。

标签: c++ qt qhash


【解决方案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 的位置,如果你不知道完整的项目,很难回答。
    只需将定义放在您认为最合适的头文件中即可。问问自己,整个项目是否真的需要这个定义,或者只是几个文件。如果你例如有一个数据层,只有你的数据类应该直接在他们的头文件中包含那个文件。一旦其他类包含您的数据类标头之一,它们就会自动知道它。

    如果您项目中的每个类都需要使用它,您可以将它放在项目根目录中的现有或新定义文件中,然后

    • 在您的预编译头文件中包含该文件(如果您正在使用该文件),或者
    • 检查您的编译器是否支持“强制包含”选项。

    【讨论】:

    • 实际上我想在我的类中实例化一个对象,而不必在 括号中指定类型。只是创建一个对象。有可能吗?
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2013-03-25
    • 2022-10-14
    • 2018-05-04
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多