简单地说,你不能以一般的方式做到这一点。无法根据运行时的名称访问成员变量。
这通常通过创建允许您将数据转换为信息的 if-else 链(或开关)来解决:
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);
// ...
}
这是一个对某些用途实际上可能有用的解决方案,但是无论如何我可能会嵌入脚本语言。