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

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

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

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


person moki    schedule 19.08.2014    source источник
comment
Вы хотите QHash<quint8, QVariant>, ничего общего с шаблонами.   -  person Oktalist    schedule 19.08.2014
comment
@Oktalist Хотелось бы, чтобы ты написал это как ответ.   -  person moki    schedule 19.08.2014
comment
Я ответил на вопрос, который вы хотели задать, а не на тот, который вы задали на самом деле. :)   -  person Oktalist    schedule 19.08.2014
comment
@Oktalist, вопрос и его описание открыты для редактирования :). В моем первоначальном описании я извинился за свой английский и не смог точно описать проблему. То, что вы только что упомянули, является моим предполагаемым вопросом. Пожалуйста, отредактируйте вопрос и его описание, чтобы отразить это.   -  person moki    schedule 19.08.2014


Ответы (2)


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

См. также https://en.wikipedia.org/wiki/Tagged_union для общего шаблона.

person Oktalist    schedule 19.08.2014

Самый простой способ сделать это — наследоваться от 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».
person Tim Meyer    schedule 19.08.2014
comment
На самом деле я хочу создать экземпляр объекта в своих классах, не указывая тип в скобках ‹ ›. Просто создание объекта. Является ли это возможным? - person moki; 19.08.2014