C++ Reflection簡單實現
阿新 • • 發佈:2019-02-15
記錄成員變數相對於class/struct的offset和size, 再根據例項指標計算出記憶體地址
#include <iostream> #include <stdlib.h> #include <vector> #define REFLEX_PROPERTY(obj,name) using namespace std; //屬性資訊記錄 struct PropertyInfo { const char* name; int offset; int size; PropertyInfo(const char* in_name, int in_offset,int in_size) { name = in_name; offset = in_offset; size = in_size; } PropertyInfo() :name("") ,offset(0) ,size(0) { } }; class ReflectObj; template<typename T> void AddProperty( ReflectObj* owner, T* property, const char* name ) { PropertyInfo newProperty = PropertyInfo(name, (char*)(property) - (char*)owner, sizeof(T)); owner->m_info.push_back(newProperty); } template<typename T> void SetProperty(ReflectObj* owner, const char* name, T value) { for (std::vector<PropertyInfo>::iterator it = owner->m_info.begin(); it != owner->m_info.end(); ++it) { if ( !strcmp(it->name,name) ) { memcpy( (char*)owner + it->offset, &value, sizeof(T)); } } } class ReflectObj { public: void Describle() { AddProperty(this, &name, "name"); AddProperty(this, &id, "id"); } int GetId(){return id;} char* GetName() { return name; } ReflectObj(char* in_name,int in_id) :name(in_name) ,id(in_id) { } private: char* name; int id; public: std::vector<PropertyInfo> m_info; };