アップデート
ドキュメントが拡張されることを期待して、 qt バグチケットを作成しました。
元の質問
2010年からの質問とQtドキュメントを信じて、カスタムタイプではoperator==()
機能しません。
見積もり:
bool QVariant::operator==(const QVariant & v) const
この QVariant を比較し、等しい場合は
v
返します。true
それ以外の場合は を返しますfalse
。
QVariant
含まれている type() の等価演算子を使用して等価性をチェックします。そのタイプがこのバリアントのタイプと同じでない場合QVariant
に試みます。可能な変換のリストについては、convert()
v
を参照してください。canConvert()
警告:この関数は、 に登録されたカスタム タイプをサポートしていません
qRegisterMetaType()
。
2010 年の Stackoverflow Question から再現ケースを再現しようとしましたが、比較は問題なく機能しました。
また、さらに一歩進んで、完全に機能する独自のクラスを使用して比較を試みました。再現するには、次のコードを任意のヘッダーに挿入します。
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<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
Q_ASSERT(var1 == var2); // Succeeds!
var1 = QVariant::fromValue<MyEnum>(Foo);
var2 = QVariant::fromValue<MyEnum>(Bar);
Q_ASSERT(var1 != var2); // Succeeds!
QVariant obj1 = QVariant::fromValue<MyClass>(MyClass(42));
QVariant obj2 = QVariant::fromValue<MyClass>(MyClass(42));
Q_ASSERT(obj1 == obj2); // Succeeds!
obj1 = QVariant::fromValue<MyClass>(MyClass(42));
obj2 = QVariant::fromValue<MyClass>(MyClass(23));
Q_ASSERT(obj1 != obj2); // Succeeds!
新しいqtバージョンでは、Q_DECLARE_METATYPE
使用時に型のサイズが取得されるため、QVariantは未知の型の値をバイトごとに比較できると思います。
しかし、これは推測にすぎません。ドキュメントに頼らずに qt の機能を推測して、アプリケーションの安定性を危険にさらしたくはありません。
QVariant が未知の型をどのように比較するかを知ることはできますか? 実装よりも仕様に依存することを好みます。