初识RTTR库

原创
2022/06/28 20:23
阅读数 1K

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);
            }

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部