c++ - 创建一个类似 Q_PROPERTY 的宏并提取 __VA_ARGS__
问题描述
QT Q_PROPERTY 宏是如何工作的?
Q_属性:
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
有了这些数据,我想编写一个结构将其保存在向量中
并映射所有类以模拟一些反射。
解决方案
快速回答是“你不能”,因为Q_PROPERTY
它不“只是”一个宏。如果你在 Qt 代码中遵循它,它最终会评估为空。为什么?Qt MOC 预处理器使用它来构建关于类的元数据。如果您查看构建树,您将看到生成的 .moc 文件。然后将它们与您的类代码一起编译。
所以换句话说,要获得相同的功能,您需要像 MOC 这样的预处理器。我以前也想做同样的事情。我真的想不出一种不生成实际动态 C++ 代码的方法(就像 MOC 一样)。可变参数很好,但宏的作用肯定是有限的。
推荐阅读
- java - 我可以在不重新运行迁移的情况下修复 Flyway 中的版本号吗?
- mulesoft - 如何让 MUnit DB 服务器从 CSV 文件创建表
- javascript - TreeView - 检查是否展开和 onClick
- flask - 在开发和部署中使用 Flask-Migration
- puppeteer - 如何从 apify 刮板获取标签:Web、Cheerio 和 Puppeteer
- django - 数据无法在 Django 模型中导入
- angular - 角材质图标动画
- sbt - 如何让 sbt 解决我的 bintray 依赖项(sbt 1.3.5)?
- r - 将控制台输出从函数接收到 .txt 文件
- javascript - 根据条件更改 D3 散点图上多个点的半径