Мне нужно иметь QHash
контейнер, который принимает quint8
ключей, но принимает гетерогенные типы в качестве значений, каждый из которых будет контейнером или классом Qt. В качестве примера я мог бы вставить QDate
или же QTime
объект или даже quint8
в качестве значения.
Как я могу определить такой тип, чтобы я мог использовать его в других моих классах и заполнять соответствующим образом во время выполнения? Я хочу иметь доступ к нему как к глобальному типу. Является ли это возможным?
Нотабене Вопрос был отредактирован, чтобы лучше отразить намерение ФП. Ответы, написанные до редактирования, соответствуют оригинальному вопросу.
QVariant
это тип, который может хранить любой из широкого диапазона типов значений, определенных во время выполнения, поэтому QHash<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 трудно ответить, если вы не знаете весь проект.
Просто поместите определение в заголовочный файл, который наиболее подходит на ваш взгляд. Спросите себя, действительно ли весь проект нуждается в этом определении или просто в нескольких файлах. Если вы, например, Если у вас есть слой данных, то только ваши классы данных должны напрямую включать этот файл в свои заголовочные файлы. Другие классы автоматически узнают об этом, как только они включают один из ваших заголовков классов данных.
Если на самом деле каждый отдельный класс в вашем проекте будет использовать его, вы можете поместить его в существующий или новый файл определений в корне вашего проекта и