c++ 字段反射 侵入式2
作者:互联网
完善 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;
}
后续嵌套结构体
标签:std,反射,name,type,register,c++,reflect,侵入,ioc 来源: https://blog.csdn.net/oAnNing1234/article/details/115384480