gpt4 book ai didi

c++ - Qt 的元系统真的那么乏味吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:00 24 4
gpt4 key购买 nike

我想使用 Qt 的反射机制,因为 C++ 缺少此功能。它似乎可以工作,但是调用所有宏和辅助函数非常繁琐。例如,要将枚举注册为适当的元类型,我必须完成以下所有步骤:

  1. 在包含 Q_GADGET 的包装类中声明一个枚举宏观。
  2. 使用 Q_ENUM 注册枚举紧随其后的宏。
  3. 注册包含枚举的类:Q_DECLARE_METATYPE(MyClass)
  4. 调用qRegisterMetaType<..>()对于包装类的类型和对于每个声明的枚举。

现在我知道如果不需要部分完整功能,可以省略一些步骤。但这不是我要找的,我需要在信号中使用枚举,我需要能够获取信号的元方法并查询它的参数类型。

但我还是忍不住想一定有更好/更简单的方法来做到这一点。

最佳答案

不幸的是,您不能做的比这少。

  • Q_GADGET(或 Q_OBJECT,对于 QObject 子类)表示“为此类生成元对象信息”。
  • Q_ENUM 表示“为这个特定的枚举生成元枚举信息”。现在有人可能会争辩说,注册类中的所有(公共(public)?)枚举也应该自动注册。但由于这是有成本的(二进制大小),而且我们使用 C++,我们不想为我们永远不会在元对象系统中使用的枚举付费,所以它是选择加入的。
  • Q_DECLARE_METATYPE(如果您正在使用 Q_ENUM,则枚举本身不需要;在您的场景中通常不需要)使类型可以在 QVariant(Qt 的 C++98,C++17 的 std::any 的无 RTTI 化身)。你是否想要这个取决于类型。我会说所有“值类型”都应该有它,但同样,这会生成您可能不想支付的额外代码。此外,这实际上仅适用于“值类型”——此注册要求类型具有公共(public)默认构造函数、公共(public)复制构造函数、公共(public)复制赋值、公共(public)析构函数。如果你有一个没有这些的类,你不能使用这个宏 => 你不能把它包装在 QVariant 中。
  • qRegisterMetaType 在运行时将上述构造函数/析构函数注册到一个表中,使您能够为该类型拥有唯一的 id(如果您想在方法签名中识别类型,则需要),动态创建或销毁该类型的实例(除其他事项外,需要实现排队连接:Qt 需要一种通用方法将信号的参数复制到要发送到目标线程的事件中,并稍后销毁这些参数),使用 Q_PROPERTY 子系统。

根据您具体需要做什么,您需要所有这些的一部分。

关于c++ - Qt 的元系统真的那么乏味吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483287/

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