我编写了一个使用 Qt 元类型系统的库。我的库的用户可以提供包装在 QVariant 中的自定义类型的值。稍后在库内部的一些代码中,我需要序列化这个 QVariant。我为几种类型实现了序列化程序,我真的不需要支持 Qt 元类型系统已知的每种类型。我序列化这些值,以便使用 JSON 通过网络发送它们。
但我想要实现的是支持自定义枚举类型,用户必须使用它来注册元类型系统qtRegisterMetaType<MyEnum>("MyEnum");
。我想通过将它转换为整数类型来序列化这样的枚举。
我尝试过QVariant::value<int>()
这样的枚举值,但它总是返回 0。QVariant::canConvert<int>()
返回 false。
是否有可能(可能使用一些肮脏的黑客攻击)获得包装枚举的整数值?Qt 如何处理其元类型系统中的枚举值?当我确定这是我在这里拥有的枚举值时,也许我可以访问原始void*
指针。
这就引出了下一个问题:如何检查 Qt 元类型是否是用户枚举类型?
请注意,由于我正在编写库的内部代码,因此我不能使用模板。我唯一的“东西”是 QVariant,没有编译时类型信息。
// code in the project using my library:
MyEnum foo;
libraryFunction(foo);
// internal library code (note that compile-time type info isn't available):
QVariant foo = getValueAsVariant(...);
if (/* how to check if foo is an enum type? */)
int enumValue = foo.value<int>(); // not working for enums!
我知道 C++ 编译器可以选择在内部使用任何整数类型(不仅是 32 位的)来存储枚举值。这对我来说是个问题吗?(例如,如果我重新解释void*
as int*
。但请记住,void*
数据是由 QVariant 本身分配的,因此它可能会为带有 . 的枚举分配超过 2 个字节sizeof == 2
。)