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

时间:2014-08-19 00:17:35

标签: c++ qt qhash

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

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

N.B。编辑问题是为了更好地反映OP的意图。编辑前编写的答案适用于原始问题。

2 个答案:

答案 0 :(得分:2)

QVariant是一种类型,可以存储在运行时确定的各种值类型,因此QHash<quint8, QVariant>就是您想要的。

另请参阅https://en.wikipedia.org/wiki/Tagged_union了解一般模式。

答案 1 :(得分: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的位置,如果您不了解整个项目,则很难回答 只需将定义放在最适合您认为的头文件中。问问自己整个项目是否真的需要这个定义,或者只是几个文件。如果你是有一个数据层,只有你的数据类应该直接在它们的头文件中包含该文件。其他类将在它们包含您的一个数据类标题后自动知道它。

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

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