我有一个有双重成员的课程:
double price;
double kg;
etc.
我有一个字符串向量,其中包含成员的名称:
vector<string> vec = {"price", "kg", etc};
我想通过将其名称传递给getValue()
方法来检索其中一个值:
double answer = getValue(vec[0]);
所以我想知道如何将成员的名称转换为该成员的值?
答案 0 :(得分:1)
首先,要认识到这并不容易。在运行时,C ++根本没有关于变量名称等的信息。如果您经常需要这些信息,请考虑使用其他语言,如C#或Java,或支持反射的任何其他语言。
话虽如此:
您似乎希望通过提供标识它的文本字符串来选择变量。
的直接系列double getValue(const string &name)
{
if( name == "name1")
return name1;
if(name == "name2")
return name2;
return not_found_value;
}
不是一个糟糕的选择。
但是,如果您想使其更复杂,但使getValue
代码更有效:
enum Names
{
NAME1, NAME2, ...NAMEN
};
typedef std::map<std::string, Names> StringToEnum;
StringToEnum stringToEnum;
void initialize()
{
stringToEnum["name1"] = NAME1;
etc for names 2 through N
}
double getValue(const string &name)
{
auto found = stringToEnum.find(name);
if(found != stringToEnum.end())
{
switch(found->second)
{
case NAME1: return name1;
case NAME2: return name2;
etc.
}
}
return notFoundValue;
}
很抱歉这很难看,但 稍微有点效率,因为地图查找比一系列字符串比较更快。如果你的向量存储枚举值而不是文本字符串会更有效(如果需要,你可以编写另一种方法将枚举值转换回文本字符串。)
在谈到效率这一切之后,让我提一下你可能不需要效率!如果效率至关重要,那么最好重新设计程序,以便不需要按名称识别变量。
考虑到这一点,我推荐最简单,最直接的代码。 if的链是“正确的”答案,因为它使得发生的事情非常明显。