1

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

我有一个包含所有 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;
}
4

3 回答 3

1

在 C++ 中,不可能将变量名转换为字符串。在某些情况下,编译后的可执行文件中甚至不存在变量名(取决于范围和可见性)。

即使有可能,枚举一个类的成员仍然是不可能的。

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

于 2013-03-21T14:32:47.673 回答
1

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

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

但是,对配置类型的事情使用不同的机制可能会更好——几个明显的选项是:

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

你也可以有一段固定的代码来理解不同的配置设置和它们到变量的转换。只要数量不多,这根本不是一个糟糕的解决方案。

或者你可以像这样构建一个数组:

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") ... 
于 2013-03-21T14:43:18.677 回答
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" ) );
于 2013-03-21T14:34:33.507 回答