- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以将我们自己的代码注入(inject)到 QVariant::canConvert 中?
我正在添加对我们自己的通用值容器和 Qt 版本 (QVariant) 之间转换的支持,主要基于此处的建议 How to support comparisons for QVariant objects containing a custom type?
我很确定这个问题的答案是“它不能完成”,浏览源代码显示 QVariant::canConvert 的实现不会调用处理程序,但我想我还是会问出来出于病态的好奇心。
在 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/
我有一个自定义的 JsonConverter,它似乎没有被正确调用。我已经创建了转换器,将其添加到 JsonSerializerSettings.Converters 集合中,并在我使用 [JsonC
是否可以将我们自己的代码注入(inject)到 QVariant::canConvert 中? 我正在添加对我们自己的通用值容器和 Qt 版本 (QVariant) 之间转换的支持,主要基于此处的建议
我有一个转换器,我只想在反序列化时使用它。所以我将 CanWrite 设置为 false,它工作正常并且一切都很好地序列化。然后,Json 字符串包含一个对象图,其中有一个 SantaClauseCo
我已经创建了 JsonConverter 的实现 CanConvert 始终返回 true。 在 ReadJson 中,我有时只想使用“默认”行为,就好像 CanConvert 返回了 false 而
我是一名优秀的程序员,十分优秀!