c++ - 有没有一种从字符串表示中设置 C/C++ 成员变量的好方法? (自省(introspection)精简版)

标签 c++ boost macros introspection

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

相关文章:

c++ - 你如何组合大型 C++ 项目的组件?

c++ - C++ 中分离线程的资源释放

c++ - boost::gregorian input_facet 意外结果

javascript - ImageJ 宏路径问题

c - 为什么全局变量会翻倍两次?

c - 使用 C 宏启用/禁用日志级别

c++ - 类枚举的正确位置

c++ - 在OpenGL中绘制完全白色的纹理

c++ - 为什么 Boost 参数选择继承而不是组合?

c++ - 如何转换不同类型的迭代器