2

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

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

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

4

2 回答 2

2

QVariant是一种可以存储多种值类型中的任何一种的类型,在运行时确定,所以 aQHash<quint8, QVariant>就是你想要的。

有关一般模式,另请参见https://en.wikipedia.org/wiki/Tagged_union

于 2014-08-19T21:15:35.823 回答
0

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

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

  • 将该文件包含在您的预编译头文件中,如果您正在使用该文件,或者
  • 检查您的编译器是否支持“强制包含”选项。
于 2014-08-19T05:36:51.287 回答