- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想使用 Qt 的反射机制,因为 C++ 缺少此功能。它似乎可以工作,但是调用所有宏和辅助函数非常繁琐。例如,要将枚举注册为适当的元类型,我必须完成以下所有步骤:
Q_GADGET
的包装类中声明一个枚举宏观。Q_ENUM
注册枚举紧随其后的宏。 Q_DECLARE_METATYPE(MyClass)
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/
我对单调/webpack/node/electron有疑问吗?我不知道。 重现步骤: git clone https://github.com/codesbiome/electron-react-we
js 并使用繁琐的方式进行连接。连接成功,我可以连接。但是在一段时间内我会失去连接并在 Azure 中收到这些错误。 RequestError: Requests can only be made i
我正在使用带有 Core.Std 模块的 ocaml utop。 要查看模块的帮助,我必须遵循别名链接,如下所示: utop # #show_module Array;; module Array =
我最初在几个月前就 ZF2 在 Beta 1 期间使用 DI 注入(inject)表提出了另一个话题,当时我认为这实际上是不可能的。现在 ZF2 已经发布为 2.0.0 版,并且默认使用 Servic
在尝试使用 MSSQL 注入(inject)准备好的语句时(乏味) - 一旦我尝试执行请求,我就会收到以下错误: Database connection failed: Requests can on
我已经找到了这个问题的答案,只想记录我的发现。 当使用 的最新版本时NW.js (和 Node.js ),我遇到了 的问题 Node -mssql /繁琐模块。即使是像连接到 这样简单的任务SQL 服
我是一名优秀的程序员,十分优秀!