在C ++中无论如何通过字符串调用对象属性?

时间:2015-01-16 22:26:29

标签: c++

假设我有一个像这样定义的对象:

struct Something
{
    int attribute1;
    string attribute2;
}

然后我有一个文件,其中包含应该应用于创建对象的一堆信息。但是,应该应用的属性名称也存储在文件中。换句话说,文本文件将包含两个值,如:

123, "attribute1"

我需要一种通过字符串引用对象属性的方法。像Something[variable_holding_attribute_name]这样的东西会很完美!

有没有办法在C ++中这样做?另请注意,我不能使用map,因为该对象包含多种数据类型。

1 个答案:

答案 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&);
};