c++字段反射 侵入式

代码 基类

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

懒得写 后续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值