QVariant сравнение с собственными типами работает?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 QVariant сравнение с собственными типами работает?

Сообщение Anonymous »

Обновление

Я создал багтикет qt в надежде, что документация будет расширена.

Оригинальный вопрос< /h1>

Полагаясь на вопрос 2010 года и документацию Qt, оператор ==() не работает с пользовательскими типами.

Цитата:


bool QVariant::operator==(const QVariant & v) const

Сравнивает этот QVariant с v и возвращает true, если они равны; в противном случае возвращается false.

Код: Выделить всё

QVariant
использует оператор равенства типа(), который он содержит, для проверки равенства. QVariant попытается преобразовать() v, если его тип не совпадает с типом этого варианта. Список возможных преобразований см. в canConvert().

Внимание: Эта функция не поддерживает пользовательские типы, зарегистрированные с помощью qRegisterMetaType. ().


Я пытался воспроизвести случай воспроизведения из вопроса Stackoverflow от 2010 года, и сравнение сработало без какие-то проблемы для меня.

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

Код: Выделить всё

enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum)

class MyClass
{
int value;
public:
MyClass() : value(0)
{
}

MyClass(int a) : value(a)
{
}

bool operator==(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return false;
}

bool operator!=(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return true;
}
};

Q_DECLARE_METATYPE(MyClass)
И следующий код в любую функцию:

Код: Выделить всё

QVariant var1 = QVariant::fromValue(Foo);
QVariant var2 = QVariant::fromValue(Foo);
Q_ASSERT(var1 == var2); // Succeeds!

var1 = QVariant::fromValue(Foo);
var2 = QVariant::fromValue(Bar);
Q_ASSERT(var1 != var2); // Succeeds!

QVariant obj1 = QVariant::fromValue(MyClass(42));
QVariant obj2 = QVariant::fromValue(MyClass(42));
Q_ASSERT(obj1 == obj2); // Succeeds!

obj1 = QVariant::fromValue(MyClass(42));
obj2 = QVariant::fromValue(MyClass(23));
Q_ASSERT(obj1 != obj2); // Succeeds!
Я предполагаю, что в новых версиях qt размер типа определяется при использовании Q_DECLARE_METATYPE, поэтому QVariant может сравнивать значения неизвестных типов побайтово.

Но это всего лишь предположение, и я не хочу рисковать стабильностью своего приложения, угадывая, что делает qt, вместо того, чтобы полагаться на документацию.
Могу ли я узнать, как QVariant сравнивает неизвестные типы? Я бы предпочел полагаться на спецификацию, а не на реализацию.

Подробнее здесь: https://stackoverflow.com/questions/197 ... es-working
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»