如何将字符串变量名转换为变量的值

时间:2016-08-25 14:56:12

标签: c++

  • 我有一个有双重成员的课程:

    double price; double kg; etc.

  • 我有一个字符串向量,其中包含成员的名称:

    vector<string> vec = {"price", "kg", etc};

  • 我想通过将其名称传递给getValue()方法来检索其中一个值:

    double answer = getValue(vec[0]);

  • 所以我想知道如何将成员的名称转换为该成员的值?

1 个答案:

答案 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的链是“正确的”答案,因为它使得发生的事情非常明显。