Как вы определяете QHash с гетерогенными типами значений?

Мне нужно иметь QHash контейнер, который принимает quint8 ключей, но принимает гетерогенные типы в качестве значений, каждый из которых будет контейнером или классом Qt. В качестве примера я мог бы вставить QDate или же QTime объект или даже quint8 в качестве значения.

Как я могу определить такой тип, чтобы я мог использовать его в других моих классах и заполнять соответствующим образом во время выполнения? Я хочу иметь доступ к нему как к глобальному типу. Является ли это возможным?

Нотабене Вопрос был отредактирован, чтобы лучше отразить намерение ФП. Ответы, написанные до редактирования, соответствуют оригинальному вопросу.

2

Решение

QVariant это тип, который может хранить любой из широкого диапазона типов значений, определенных во время выполнения, поэтому QHash<quint8, QVariant> это то, что вы хотите.

Смотрите также https://en.wikipedia.org/wiki/Tagged_union для общей картины.

2

Другие решения

Самый простой способ сделать это — наследовать от 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».
0

По вопросам рекламы [email protected]