我需要一个QHash
容器,它接受quint8
键但将异构类型作为值,所有这些都将是 Qt 容器或类。作为一个例子,我可能想插入一个QDate
或QTime
对象,甚至quint8
作为值。
如何定义这样的类型,以便可以在其他类中使用它并在运行时适当填充?我希望能够将其作为全局类型访问。是否可以?
NB 问题已被编辑以更好地反映 OP 的意图。编辑前写的答案适用于原始问题。
QVariant
是一种可以存储多种值类型中的任何一种的类型,在运行时确定,所以 aQHash<quint8, QVariant>
就是你想要的。
有关一般模式,另请参见https://en.wikipedia.org/wiki/Tagged_union。
最简单的方法是继承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 的位置,如果你不知道完整的项目,很难回答这个问题。
只需将定义放在您认为最合适的头文件中即可。问问自己,整个项目是否真的需要这个定义,或者只是几个文件。例如,如果您有一个数据层,那么只有您的数据类应该直接将该文件包含在它们的头文件中。一旦其他类包含您的数据类标题之一,它们就会自动知道它。
如果您项目中的每个类都使用它,您可以将它放在项目根目录中的现有或新定义文件中,然后