创建一个类似 Q_PROPERTY 的宏并提取 __VA_ARGS__

Posted

技术标签:

【中文标题】创建一个类似 Q_PROPERTY 的宏并提取 __VA_ARGS__【英文标题】:Create a macro like Q_PROPERTY and extract __VA_ARGS__ 【发布时间】:2019-09-30 20:18:19 【问题描述】:

QT Q_PROPERTY 宏是如何工作的?

Q_PROPERTY:

    Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)

我需要创建一个类似于 Q_PROPERTY 的宏。我的目标是将类的属性存储在向量中

例如我有一个 Person 类

Person 

private:

std::string name;
std::string lastname;

public: 

std::string name();
void set_name(std::string name);




我想在我的班级中做一些类似 Q_PROPERTY 的操作来存储向量中的字段如何被称为 getter、setter 以及属性的类型和名称

例如从宏接收此数据:

类型 姓名 读 写

如果我有一个宏:

#define PROPERTY(...)

PROPERTY(std::string name READ name WRITE set_name)
PROPERTY(std::string email READ email WRITE set_email)

我如何从 VA_ARGS 中提取元素,例如:

__VA_ARGS__['TYPE'] this should write std::string
__VA_ARGS__['NAME'] this should write name
__VA_ARGS__['READ'] this should write name
__VA_ARGS__['WRITE']this should write set_name

有了这些数据,我想写一个结构把它保存在一个向量中

并将所有类映射为模拟某种反射。

【问题讨论】:

__VA_ARGS__ 只是将捕获的所有参数转发到可变参数宏中使用它的任何位置。所以:#define M(...) f(__VA_ARGS__) 意味着M(foo, bar) 将扩展为f(foo, bar) 【参考方案1】:

快速回答是“你不能”,因为Q_PROPERTY 不“只是”一个宏。如果你在 Qt 代码中遵循它,它最终会评估为空。为什么? Qt MOC 预处理器使用它来构建关于类的元数据。如果您查看构建树,您将看到生成的 .moc 文件。然后将它们与您的类代码一起编译。

换句话说,要获得相同的功能,您需要像 MOC 这样的预处理器。我以前也想做同样的事情。我真的想不出一种不生成实际动态 C++ 代码的方法(就像 MOC 一样)。可变参数很好,但宏的作用肯定是有限的。

【讨论】:

以上是关于创建一个类似 Q_PROPERTY 的宏并提取 __VA_ARGS__的主要内容,如果未能解决你的问题,请参考以下文章

没有空间的宏

用于搜索文件是否存在的宏并在Excel单元格中保留Y或N?

类似于 SIMD 指令的宏

从日期宏中仅提取年份

MSVC++ 可变参数宏扩展

更新后禁用带有证书的宏