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更方便。 ...