【问题标题】:Convert member variable name to a string将成员变量名称转换为字符串
【发布时间】:2013-03-21 14:28:31
【问题描述】:

我可以在 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;
}

【问题讨论】:

  • 不,看来您还是以错误的方式解决了问题。

标签: c++ stringification


【解决方案1】:

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

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

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

  1. 使用std::map&lt;std::string, std::string&gt;
  2. 使用std::pair&lt;std::string, std::string&gt;的数组或向量

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

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

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】:

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

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

    解决这个问题的另一种方法是使用std::map,而不是使用像“host”这样的字符串作为键,然后枚举它。

    【讨论】:

    • 使用(不那么漂亮的)宏,您可以将变量名转换为其字符串表示形式
    • @IvayloStrandjev:是的,但此时特定变量已经被硬编码,您不妨硬编码名称。无论如何,OP想要枚举,即使使用您的宏也是不可能的。
    【解决方案3】:

    在 C++ 中无法完全按照您的要求进行操作。但是,如果您想要的只是一组键值对,那么有解决方案。

    例如,将class configitems 改为std::map&lt;std::string, std::string&gt; configitems

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

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 2017-07-19
      • 2011-08-27
      • 2010-12-04
      • 2016-11-20
      • 2018-02-14
      • 2015-10-25
      相关资源
      最近更新 更多