首页 / C++ / c++ 字段反射 侵入式2
c++ 字段反射 侵入式2
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++ 字段反射 侵入式2,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2263字,纯文字阅读大概需要4分钟。
内容图文
![c++ 字段反射 侵入式2](/upload/InfoBanner/zyjiaocheng/596/a268c0cf725e42d5a9f9b161acf4c110.jpg)
完善 reflect类 添加到容器 通过 字符串创建 结构体 并修改 字段值
//宏添加
#define REFLECT_CLASS(type) _struct_name=#type
#define REFLECT_PROPERTY(property) register_property(property,#property);
//添加到容器
#define REFLECT_REGISTER(type)template<>struct register_ioc_base<type>{private: struct register_ioc { register_ioc() { reflect::register_type<type>(#type); reflect::register_type<type>(typeid(type).name); reflect::register_type<type>(typeid(std::shared_ptr<type>).name); reflect::register_type<type>(typeid(std::vector<std::shared_ptr<type>>).name); } } static register_ioc _register;};__declspec(selectany) register_ioc_base<type>::register_ioc register_ioc_base<type>::_register;
template<typename _Ty>
struct register_ioc_base{};
struct reflect
{
struct property
{
int index = 0;
int offset = 0;
std::string name;
std::string type_name;
}
//
template<typename _Value>
_Value & value(std::string name)
{
if(_propertys.find(name) == _propertys.end())
{
throw;
}
return (*(_Value*)(ULONG_PTR(this) + _propertys[name].offset));
}
template<typename _Ty>
void register_property(_Ty &t,std::string name)
{
if(_propertys.find(name) != _propertys.end())
return;
property tmp;
tmp.index = _propertys.size();
tmp.name = name;
tmp.type_name = typeid(_Ty).name();
tmp.offset = ULONG_PTR(&t) - ULONG_PTR(this);
_propertys[name] = tmp;
}
std::map<std::string,property> get_propertys() const
{
return _propertys;
}
template<typename _Ty>
static void register_type(std::string name)
{
if(_ioc.find(name) != _ioc.end())
return;
std::functional<reflect*()> func = [](){return new _Ty};
_ioc[name] = func;
}
static reflect * resolve(std::string name)
{
if(_ioc.find(name) != _ioc.end())
return _ioc[name]();
return nullptr;
}
private:
std::map<std::string,property> _propertys;
std::string _struct_name;
static std::map<std::string,std::functional<reflect*()>> _ioc;
}
__declspec(selectany) std::map<std::string,std::functional<reflect*()>> reflect::_ioc;
用法
struct test : public reflect
{
test()
{
REFLECT_CLASS(test);
REFLECT_PROPERTY(id );
REFLECT_PROPERTY(name);
REFLECT_PROPERTY(age );
}
int id = 0;
std::string name;
int age = 0;
}
REFLECT_REGISTER(test )
int main()
{
reflect *t = reflect::resolve("test");
t.value<int>("id") = 10;
t.value<std::string>("name") = "test";
t.value<int>("age ") = 50;
return 0;
}
后续嵌套结构体
内容总结
以上是互联网集市为您收集整理的c++ 字段反射 侵入式2全部内容,希望文章能够帮你解决c++ 字段反射 侵入式2所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。