Как конвертировать 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