Как конвертировать unsigned long int в QVariant

Я понял, что QVariant не предлагает функциональность для long а также unsigned long, Он предлагает преобразования в int, unsigned int, long long а также unsigned long long,

В современных архитектурах настольных ПК мы можем найти long а также int эквивалентны, но они не с теоретической точки зрения.

Если я хочу хранить long в QVariant Я обязан сначала преобразовать значение в long long, Я хотел бы знать, есть ли другой способ преодолеть это.

Во-вторых, мне интересно узнать лучший / более простой способ сделать это. Т.е. используя более простой код и избегая использования ненужного места или инструкций.

2 ответа

Решение

Если я хочу хранить long в QVariant, Я обязан сначала преобразовать значение в long long,

 QVariant store (unsigned long int input) {
    unsigned long long data = (unsigned long long) input;
    QVariant qvariant( data );
    return qvariant;
 }

 unsigned long int load (const QVariant& qvariant) {
    bool ok;
    unsigned long int data = (unsigned long) qvariant.toULongLong(&ok);
    if (ok)
       return data;
    else
       return NAN;
 }

Очень вероятно (в соответствии с заголовком вопроса), что автор темы получил от компилятора следующее сообщение об ошибке:

    error: conversion from ‘uint64_t {aka long unsigned int}’ to ‘QVariant’ is ambiguous

Ни один из предложенных ответов не дает простого решения. Итак, вместо неявного преобразования из значения, что-то вроде

    QVariant_value = long_unsigned_int_value;

попробуйте следующее:

    QVariant_value = QVariant::fromValue(long_unsigned_int_value)

Это мне помогло.

Эта проблема не касается дизайна класса QVariant. но это проблема длинного типа.

Изменение типа long, но int (4) или long long (8) одинаково во всех LLP64/IL32P64 LP64/I32LP64, как указано в википедии.

Зона разработчиков Intel говорит:

Предложение. Если для вас важно, чтобы целочисленные типы имели одинаковый размер на всех платформах Intel, рассмотрите возможность замены "long" на "int" или "long long". Размер целочисленного типа "int" составляет 4 байта, а размер целочисленного типа "long long" составляет 8 байтов для всех вышеуказанных комбинаций операционной системы и архитектуры.

Удачи
/Mohamed

Другие вопросы по тегам