我有一些成员希望从字符串中获取和设置的结构。鉴于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/

10-11 21:03