gpt4 book ai didi

c++ - 替换 QVariant::Handler::canConvert

转载 作者:行者123 更新时间:2023-11-28 02:14:10 25 4
gpt4 key购买 nike

是否可以将我们自己的代码注入(inject)到 QVariant::canConvert 中?

我正在添加对我们自己的通用值容器和 Qt 版本 (QVariant) 之间转换的支持,主要基于此处的建议 How to support comparisons for QVariant objects containing a custom type?

我很确定这个问题的答案是“它不能完成”,浏览源代码显示 QVariant::canConvert 的实现不会调用处理程序,但我想我还是会问出来出于病态的好奇心。

https://github.com/qtproject/qt/blob/b05d05fd9ce2aeedfaf805a7ed9007a93c902bc9/src/corelib/kernel/qvariant.cpp#L2719

在 QVariant 实现中是否有任何随机位置,我们可以在其中获得某种 Hook 到这种功能(无需重新编译 Qt),如果没有,Handler 上的函数是否用于任何事情/它为什么存在?大多数情况下 - 有什么解决此问题的建议吗?

最佳答案

当然,您可以将 QVariant::canConvert() 与您的自定义数据类型一起使用。唯一需要注意的是,您必须向类型系统注册该类型。如果您不这样做,您将通过 static_assert 收到友好的提醒,

error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system

例如,这段代码工作得很好,

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() 等模板,但它不会影响 QVariant::toInt() 和类似的模板,即使您专门化了 int 案例。例如,

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

关于c++ - 替换 QVariant::Handler::canConvert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com