gpt4 book ai didi

c++ - 有没有办法将 QMetaEnum 与属于非 Q_OBJECT 或 Q_GADGET 类的 Q_ENUMS 一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:39 27 4
gpt4 key购买 nike

例如我有以下类(class):

namespace someName
{
class someClass
{
Q_ENUMS(ESomeEnum)

public:
enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};

// ... some other things ..
}
}

Q_DECLARE_METATYPE(someName::someClass)

有没有办法使用 QMetaEnum::valueToKey 或 QMetaEnum::keyToValue ?

尝试了this answer中的方法但出现以下错误:

error: static assertion failed: QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG
#define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)

我可以使用 X-Macros 来获得我想要的输出,但在 Qt 中学习更多技巧也很好。

最佳答案

不,没有,因为Q_ENUM的功能是在moc生成的代码中实现的,moc会忽略既不是Q_OBJECT也不是Q_GADGET的类。没有理由不使用 Q_GADGET,因为它对对象大小没有影响:不添加虚拟方法或数据字段。

下面证明了这一点:

#include <QtCore>

namespace Ns {
class Class {
Q_GADGET
public:
enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};
Q_ENUM(ESomeEnum)
};
}

int main() {
auto metaEnum = QMetaEnum::fromType<Ns::Class::ESomeEnum>();
qDebug() << sizeof(Ns::Class) << metaEnum.valueToKey(Ns::Class::ENUM_A);
}
#include "main.moc"

输出:

1 ENUM_A

在这个特定平台(以及许多其他平台)上,空类的大小为 1。

关于c++ - 有没有办法将 QMetaEnum 与属于非 Q_OBJECT 或 Q_GADGET 类的 Q_ENUMS 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37677186/

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