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