Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        3年前关闭。
                                                                                            
                
        

我有一个双重成员的班级:

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;
}


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

说完所有关于效率的内容后,请允许我提及您可能不需要效率!如果效率至关重要,那么最好重新设计程序,这样就无需按名称标识变量。

考虑到这一点,我建议使用最简单,最直接的代码。 if的链是“正确”的答案,因为它使正在发生的事情非常明显。

关于c++ - 如何将字符串变量名称转换为变量的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39148572/

10-14 09:05
查看更多