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

我有一个所有const char *成员的类(class)。如果有一种优雅的方法来枚举每个成员变量,并根据给出的字符串键将名称检查为字符串,那将是很好的。

这是可以使用的那种代码?

有人能想到一种方法吗?

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

最佳答案

正如其他人所说的那样,一旦编译器完成了代码的编译,变量名实际上就不会存在于生成的代码中。它可能存在于调试符号中或类似的符号中,但这是一个可怕的困惑,试图进入以确定变量的位置[根据编译器当前是使用寄存器还是内存位置来存储变量,它可能位于不同的位置其值等)。

当然,可以有一个宏来生成与参数中的名称匹配的字符串。

但是,最好对配置类型的事物使用不同的机制-几个显而易见的选择是:

  • 使用std::map<std::string, std::string>
  • 使用std::pair<std::string, std::string>的数组或 vector

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

    或者您可以构建一个像这样的数组:
    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") ...
    

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

    10-14 07:12