我有一些成员希望从字符串中获取和设置的结构。鉴于C++没有任何自省(introspection)功能,我认为我需要一些具有创意的宏解决方案,stringize运算符,也许还有boost::bind.
,我不需要完整的序列化或自省(introspection)功能,更不需要“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")
而不是拥有巨大的
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/