假设我有一个像这样定义的对象:
struct Something
{
int attribute1;
string attribute2;
}
然后我有一个文件,其中包含应该应用于创建对象的一堆信息。但是,应该应用的属性名称也存储在文件中。换句话说,文本文件将包含两个值,如:
123, "attribute1"
我需要一种通过字符串引用对象属性的方法。像Something[variable_holding_attribute_name]
这样的东西会很完美!
有没有办法在C ++中这样做?另请注意,我不能使用map
,因为该对象包含多种数据类型。
答案 0 :(得分:1)
仅仅因为您的struct
使用不同的数据类型并不意味着您无法使用std::map
来访问它们,因为您可以。尝试这样的事情:
struct Something
{
int attribute1;
std::string attribute2;
};
void set_attr1(Something &obj, const std::string &value)
{
std::istringstream iss(value);
iss >> obj.attribute1;
}
void set_attr2(Something &obj, const std::string &value)
{
obj.attribute2 = value;
};
typedef void (*set_func)(Something&, const std::string&);
std::map<std::string, set_func> m;
m["attribute1"] = &set_attr1;
m["attribute2"] = &set_attr2;
...
Something obj;
std::string value = ...; // "123"
std::string name = ...; // "attribute1"
m[name](obj, value);
/*
Or safer:
std::map<std::string, set_func>::iterator iter = m.find(name);
if (iter != m.end())
iter->second(obj, value);
*/
如果你想要一些更灵活的东西,允许你为同一数据类型的多个字段重用给定的函数,甚至可以为不同{{1}的map
重用相同的函数。 } s,你可以这样做:
struct
template<typename ObjType, typename MemType, MemType ObjType::*member>
void set_member(ObjType &obj, const std::string &value)
{
std::istringstream iss(value);
iss >> obj.*member;
}
template<typename ObjType, std::string ObjType::*member>
void set_str_member(ObjType &obj, const std::string &value)
{
obj.*member = value;
}
template<typename ObjType>
struct set_member_hlpr
{
typedef void (*func_type)(ObjType&, const std::string&);
};