もちろんQVariant::canConvert()
、カスタム データ型で使用できます。唯一の注意点は、型を型システムに登録する必要があることです。そうでない場合はstatic_assert
、
エラー: 静的アサーションに失敗しました: タイプが登録されていません。Q_DECLARE_METATYPE マクロを使用して、Qt のメタオブジェクト システムに認識させてください
たとえば、このコードは完全に正常に動作します。
struct Foo {
int a, b;
};
Q_DECLARE_METATYPE(Foo)
int main()
{
Foo foo {1, 2};
QVariant variant = QVariant::fromValue(foo);
qDebug() << variant.canConvert<Foo>();
}
デフォルトのテンプレートを上書きしたい場合は、必要なことは、必要に応じて独自の専門化を提供することだけです。
template<>
bool QVariant::canConvert<Foo>() const {
qDebug() << "Hello from my specialization!";
return userType() == qMetaTypeId<Foo>();
};
これはすべてテンプレート化されているため、「ハンドラー」はありません。注意してください - QVariant::value() のようなテンプレートを特殊化できますが、int
ケースを特殊化しても QVariant::toInt() などには影響しません。例えば、
template<>
int QVariant::value<int>() const
{
if (userType() == qMetaTypeId<Foo>()) {
return value<Foo>().a + value<Foo>().b;
};
return toInt();
}
....
qDebug() << variant.value<int>() << variant.toInt();
生産し、
3 0