문자열에서 가져 와서 설정할 수있는 멤버가있는 구조체가 있습니다. C++가 어떤 인트로 스펙 션을 가지고 있지 않다면 나는 매크로, 문자열 연산자 및 어쩌면 boost::bind.
과 함께 창의적인 솔루션이 필요하다고 생각한다. 전체 직렬화 또는 인트로 스펙 션, 더 많은 '인트로 스펙 션 라이트'가 필요 없다.문자열 표현에서 C/C++ 멤버 변수를 설정하는 좋은 방법이 있습니까? (introspection-lite)
내가 원한다. 이의 라인을 따라 뭔가를하기 : 거대한 if
문이보다는
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")
.
깔끔한 해결책이 있습니까?
관련 질문 : Object Reflection
편집 : '* :: 형식을 int로 매핑'트릭에 대한 maxim1000에 감사합니다 -이 나를 위해 일한 :
#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);
, currentAttr, "3")? –
boost :: lexical_cast도 유용 할 수 있습니다. –
@Matthieu : 네 번째 인자는 문자열 변수 일 수 있습니다. 예를 들어'fieldA = 3, fieldB = 10' 형식의 텍스트를 파싱하고이 함수를 호출 할 수 있습니다. @ltcmelo - 예,'lexical_cast'는 다음과 같이 할 수 있습니다. 형식 변환에 유용하지만, 그 순간 값이 항상 int가 될 것이라는 것을 알고 있다고 가정 해 봅시다. –