the*_*ill 5 c++ macros boost introspection
我有一个结构,其中包含一些我希望能够从字符串中获取和设置的成员.鉴于C++没有任何内省,我认为我需要一些宏的创造性解决方案,stringize运算符,也许boost::bind.我不需要完整的序列化或内省,更像是'introspection-lite'
我想有一些类似的东西:
struct MyType {
int fieldA;
int fieldB;
};
DECLARE_STRING_MAP(MyType,fieldA);
DECLARE_STRING_MAP(MyType,fieldB);
MyType t;
SET_VALUE_FROM_STRING(MyType,t,"fieldA","3")
Run Code Online (Sandbox Code Playgroud)
而不是有一个巨大的if声明.
知道是否有一个简洁的解决方案吗?
相关问题:对象反射
编辑:感谢maxim1000的'map to int Type ::*'技巧 - 这对我有用:
#define DEFINE_LOOKUP_MAP(Type) std::map<AnsiString,int Type::*> mapper
#define ADD_FIELD_MAPPING(Type, Field) mapper[#Field]=&Type::Field
#define SET_FIELD_FROM_MAP(Type, Field, var, value) var.*(mapper[#Field])=value
DEFINE_LOOKUP_MAP(MyType);
ADD_FIELD_MAPPING(MyType, fieldA);
ADD_FIELD_MAPPING(MyType, fieldB);
SET_FIELD_FROM_MAP(MyType, fieldA, obj, 3);
Run Code Online (Sandbox Code Playgroud)
如果所有类型都相同,您可以使用以下内容:
std::map<std::string,int MyType::*> mapper;
mapper["fieldA"]=&MyType::fieldA;
mapper["fieldB"]=&MyType::fieldB;
...
MyType obj;
obj.*(mapper["fieldA"])=3;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1854 次 |
| 最近记录: |