我有一个包含一些成员的结构,我希望能够从字符串中获取和设置这些成员。鉴于 C++ 没有任何内省(introspection),我想我需要一些创造性的解决方案,包括宏、字符串化运算符,也许还有 boost::bind。
我不需要完整的序列化或内省(introspection),更多的是“内省(introspection)” -精简版'
我想要一些与此类似的东西:
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")
而不是有一个巨大的 if
语句。
知道是否有一个巧妙的解决方案吗?
相关问题:Object Reflection
编辑: 感谢 maxim1000 的“映射到 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);
最佳答案
如果它们都具有相同的类型,你可以使用这样的东西:
std::map<std::string,int MyType::*> mapper;
mapper["fieldA"]=&MyType::fieldA;
mapper["fieldB"]=&MyType::fieldB;
...
MyType obj;
obj.*(mapper["fieldA"])=3;
关于c++ - 有没有一种从字符串表示中设置 C/C++ 成员变量的好方法? (自省(introspection)精简版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687888/