Mam strukturę z niektórymi członkami, które chcę móc uzyskać i ustawić z łańcucha. Biorąc pod uwagę, że C++ nie ma żadnej introspekcji, potrzebuję kreatywnego rozwiązania z makrami, operatorem naciągania i może boost::bind.
Nie potrzebuję pełnej serializacji lub introspekcji, bardziej "introspekcyjno-lite". mieć coś na wzór tego:Czy istnieje dobry sposób ustawiania zmiennych składowych C/C++ z reprezentacji ciągów? (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")
Zamiast mieć ogromny if
oświadczenie.
Każdy pomysł, czy jest to miłe rozwiązanie?
pytanie pokrewne: Object Reflection
EDIT: Dzięki maxim1000 dla 'mapę do typu int *' :: sztuczki - to pracował dla mnie:
#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);
Przypuszczam, że chcesz napisać SET_VALUE_FROM_STRING (MyType, t , currentAttr, "3"), jak również? –
boost :: lexical_cast może być również użyteczny. –
@Matthieu: tak, trzeci argument może być zmienną łańcuchową, np. Mogę przetworzyć tekst w postaci 'fieldA = 3, fieldB = 10' i wywołać tę funkcję @ltcmelo - tak,' lexical_cast' może Przydaj się do konwersji typu, ale załóżmy na chwilę, że wiem, że wartości zawsze będą int. –