代码 基类
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;
}
private:
std::map<std::string,property> _propertys;
}
用法
struct test : public reflect
{
test()
{
register_property(id ,"id");
register_property(name,"name");
register_property(age ,"age ");
}
int id = 0;
std::string name;
int age = 0;
}
int main()
{
test t;
t.value<int>("id") = 10;
t.value<std::string>("name") = "test";
t.value<int>("age ") = 50;
return 0;
}
懒得写 后续