ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++ 字段反射 侵入式2

2021-04-01 21:34:20  阅读:233  来源: 互联网

标签:std 反射 name type register c++ reflect 侵入 ioc


完善 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有