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

How to convert a string variable name into a the value of the variable

本文关键字:变量 转换 变量名 字符串      更新时间:2023-10-16
  • 我有一个有双重成员的班级:

    double price; double kg; etc.

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

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

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

    double answer = getValue(vec[0]);

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

首先,要认识到这并不容易。在运行时,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;
}    

很抱歉,这很难看,但它的效率略高,因为映射查找比一系列字符串比较更快。如果您的向量存储枚举值而不是文本字符串,则效率会更高(如果需要,您可以编写另一种方法将枚举转换回文本字符串。(

说了这么多关于效率的话,让我提一下,你可能不需要它来提高效率!如果效率至关重要,那么最好重新设计程序,这样就不需要按名称识别变量。

考虑到这一点,我推荐最简单、最直接的代码。"如果"的链条是"正确"的答案,因为它使正在发生的事情变得非常明显。