C++下实现机制的反射「2」——升级自省功能

在上一篇「part1」中,实现了一个能够存储类的成员变量的结构,使用父类Base中的set_field方法,将派生类的成员变量映射进map中,所以我们只需要在Base类中编写一堆方法就能直接调用派生类的成员变量。 例如: 导出成JSON格式数据 string to_json() { string json = "{"; for(auto i = m_table.begin(); i != m_table.end();) { json.append("\""); json.append(i->first); json.append("\":"); switch(i->second.first) { case INT_TYPE: json.append(to_string(*static_cast<int*>(i->second.second))); break; case DOUBLE_TYPE: json.append(to_string(*static_cast<double*>(i->second.second))); break; case STRING_TYPE: json.append("\""); json.append(*static_cast<string*>(i->second.second)); json.append("\""); break; } if(++i != m_table.end()) { json.append(","); } } json.append("}"); return json; } 由于保存指针的类型是void *,所以在使用的时候都需要对其使用static_cast转化一下,使用强制转换也是可以的,然而因为指针所以是比较危险的操作,推荐还是用cast转化指针类型,才能正确的获取值。就这样不需要每个类都要重写一个方法,就能很愉快的节省时间,如果是QT框架的话还可以直接转化成QJsonObject更方便。 ...

一月 16, 2020 · 猫贩子薛定谔

C++下实现机制的反射「1」——自省

反射(Reflection)机制 是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。wiki 在其他语言中都有大量的应用,尤其是Java中反射与注解配合使用可以大大的减少工作量,降低重复代码,也能使程序更容易维护。现代Java框架中已经离不开反射与注解了。 目标 最近在公司的QT项目中需要大量的使用数据库,虽然QT提供了非常方便的数据库连接驱动与API,但是并没有更方便的ORM功能,只能拼写Sql语句之后运行,再从结果中手动处理得到对象。 虽然这么做并没有什么问题,但是问题是当一个软件设计到一定程度,例如出现了N个需要存储的对象,如果按照Model,DAO,Service,Controller的MVC设计思路,每一个Model都需要手动为其写insert,update,delete的函数。到最后,同样功能的sql语句可能会写十几遍,所以需要设计一套能应对此类情况的框架。 所以,我们就要在C++环境下设计与实现反射机制以及ORM系统。 ...

一月 7, 2020 · 猫贩子薛定谔