C++反射库
https://github.com/rttrorg/rttr
反射实现数据类型的转换
获取结构体字段的属性 值 类型 方法
作用一:
数据库操作结构体通过字段名获取
https://github.com/rttrorg/rttr/blob/master/src/examples/json_serialization/main.cpp
作用二:
dll加载 ,接口调用
https://github.com/rttrorg/rttr/blob/master/src/examples/library_loading/library_loader_example/main.cpp
作用三:
json序列化
https://github.com/rttrorg/rttr/tree/master/src/examples/json_serialization
作用四:
脚本语言对接:
https://github.com/rttrorg/rttr/tree/master/src/examples/scripting
反射使用demo:
RTTR_REGISTRATION
{
rttr::registration::class_<HEventData>("HEventData")
.constructor<>()
.property("EVENTID", &HEventData::eventId)
.property("SOURCENODE", &HEventData::sourceNode)
.property("PARENTNODE", &HEventData::parentNode)
.property("RECEIVETIME", &HEventData::receiveTime)
.property("SOURCETIME", &HEventData::sourceTime)
.property("TYPE", &HEventData::type)
.property("SUBTYPE", &HEventData::subType)
.property("SEVERITY", &HEventData::severity)
.property("MESSAGE", &HEventData::message)
.property("OPERATOR", &HEventData::OPERATOR)
.property("COMMENT", &HEventData::comment)
.property("VALUE", &HEventData::value)
.property("VALUETYPE", &HEventData::valueType)
.property("RETAIN", &HEventData::retain)
.property("ACTIVE", &HEventData::active)
.property("ACTIVETIME", &HEventData::activeTime)
.property("ACKED", &HEventData::acked)
.property("ACKEDTIME", &HEventData::ackedTime);
}
SOCI查询数据库&&遍历结构体后赋值
soci::rowsetsoci::row rs = (sql.prepare << sessionSql,
use(eventId),
use(sTime),
use(eTime),
use(queryLen));
for (const soci::row& rowData : rs) {
int i = 0;
HEventData obj;
type t = type::get<HEventData>();
for (auto prop : t.get_properties()) {
std::string strType = prop.get_type().get_name().to_string().c_str();
std::cout << "name:" << prop.get_name().to_string()
<<"type:" <<strType << std::endl;
//这块代码不可省略 因为rttr::type无法转化为基础类型去使用
if (0 == strcmp(strType.c_str(), "__int"))
{
auto value = rowData.get<int>(prop.get_name().to_string());
prop.set_value(obj, value);
}
else if (0 == strcmp(strType.c_str(), "__int64"))
{
auto value = rowData.get<Ino_Int64>(prop.get_name().to_string());
prop.set_value(obj, value);
}
else if (0 == strcmp(strType.c_str(), "std::string"))
{
auto value = rowData.getstd::string(prop.get_name().to_string());
prop.set_value(obj, value);
}
}
datas.emplace_back(obj);
}