将成员变量名称转换为字符串

时间:2013-03-21 14:28:32

标签: c++ stringification

我可以在C ++中枚举类(或结构)的char*成员吗?如果是这样,我可以将变量名称打印为字符串吗?使用预处理器?

我有一个包含所有const char *成员的类。如果有一种优雅的方法来枚举每个成员变量并将名称作为字符串检查我给出的字符串键,那将是一件好事。

以下是可以使用的代码类型?

有人可以想办法吗?

class configitems {
public:
   configitems() : host(0), colour(0) {}
   const char* host;
   const char* colour;
   //... etc
};

int main() {

   configitems cfg;
   //cfg.colour = "red";

   //receive an config item as a string.  I want to check that the item is a valid one (eg is a 
   //variable of class configitem) and then populate it.

   //eg get colour=red so want to do something like this:
   if(isConfigItem("colour")) {
      cfg.<colour> = "red";
   }
   return 0;
}

3 个答案:

答案 0 :(得分:1)

在C ++中,无法将变量名称转换为字符串。在某些情况下,变量名甚至不存在于已编译的可执行文件中(取决于作用域和可见性)。

即使有可能,也无法枚举班级成员。

解决此问题的另一种方法是使用std::map代替使用“host”之类的字符串作为键,并枚举它。

答案 1 :(得分:1)

正如其他人所说,一旦编译器编译完代码,变量的名称实际上并不存在于生成的代码中。它可能存在于调试符号或其他类似的东西中,但是尝试进入以确定变量所在的位置是一个可怕的混乱[它可能存在于不同的位置,具体取决于编译器当前是使用寄存器还是存储器位置来存储它的价值等等]。

当然可以使用一个宏来为参数中的名称生成匹配的strin。

但是,对配置类型的东西使用不同的机制可能更好 - 有两个明显的选择:

  1. 使用std::map<std::string, std::string>
  2. 使用std::pair<std::string, std::string>
  3. 的数组或向量

    您还可以使用一段固定代码,了解不同的配置设置及其对变量的转换。只要没有大量的解决方案,这根本不是一个糟糕的解决方案。

    或者您可以构建一个这样的数组:

    enum config_vals
    {
        host,
        color,
        ...
        max_config
    };
    
    struct translation
    {
       const char *name;
       config_vals val;
    };
    
    #define TRANS(x) { #x, x }
    
    translation trans[]] = {
        TRANS(host),
        TRANS(color),
    };
    
    class configitems
    {
      ...
      std::string value[max_configs];
      ...
    }
    
    ... 
    
    configitems c;
    ...
    if (c.value[host] == "localhost") ... 
    

答案 2 :(得分:0)

C ++中没有办法完全按照你要做的去做。但如果您想要的只是一组键值对,那么就有解决方案。

例如,代替class configitems,将其设为std::map<std::string, std::string> configitems

std::map<std::string, std::string> configitems;
//...
configitems.insert( std::pair<std::string,std::string>( "colour", "red" ) );