Просто, вы можете» это сделать в общем виде; нет возможности получить доступ к переменным-членам на основе их имени из среды выполнения.
Это, как правило, решается путем создания, если-иначе цепь (или переключатель), который позволяет конвертировать данные в информации:
char type;
float height;
int age;
cin >> type;
switch(type) {
case 'h': cin >> height; break;
case 'a': cin >> age; break;
}
Это негибкий, но так ваша структура класса, правильно? Если вы хотите сделать его динамичным, создание привязок, как в ответе @ riv, имеет мало смысла; любое изменение в классе потребует правильной оговорки. Было бы лучше, чтобы просто решить, что некоторые поля динамически хранятся на карте:
class C {
int iAlwaysHaveThat;
map<variant<int,float,string>> dynamicValues;
};
Таким образом, вы можете анализировать файлы конфигурации, такие как:
Obj [
a = 5,
b = 3.14,
name = "some string value"
]
А затем получить к ним доступ (в зависимости от фактических потребностей) функция, возвращающая optional
:
optional<variant<...>> getDynamicValue(string const& name) { ... }
которые также могут заполнить значения по умолчанию, основываясь на какой-либо другой объект, например:
{
// ...
auto v = dynamicValues.find(name);
if (v == dynamicValues.end())
return defaultValuesProvider.getDefault(name);
// ...
}
Это решение, которое может быть действительно полезным для некоторых целей, однако я бы, вероятно, ввел язык сценария в любом случае.
Я все еще немного потерян. Как это изменит стоимость объекта? – user2424954
@ user2424954, представьте, что это хэш, вы можете получить доступ к своим свойствам из строки. – Lefsler
Итак, в моем случае я бы сделал что-то вроде Box a; MapData [имя] = значение; a.mapData [имя] = значение? Извините за конкретные вопросы. Я довольно новичок в C++ – user2424954