我需要一个QHash
容器,它接受quint8
个键,但将异构类型作为值,所有这些都是Qt容器或类。作为示例,我可能希望插入QDate
或QTime
对象甚至quint8
作为值。
如何定义这样的类型,以便我可以在其他类中使用它并在运行时适当填充?我希望能够以全局类型访问它。有可能吗?
N.B。编辑问题是为了更好地反映OP的意图。编辑前编写的答案适用于原始问题。
答案 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的位置,如果您不了解整个项目,则很难回答 只需将定义放在最适合您认为的头文件中。问问自己整个项目是否真的需要这个定义,或者只是几个文件。如果你是有一个数据层,只有你的数据类应该直接在它们的头文件中包含该文件。其他类将在它们包含您的一个数据类标题后自动知道它。
如果项目中的每个类都使用它,您可以将它放在项目根目录中的现有或新定义文件中