1

char*C ++でクラス(または構造体)のメンバーを列挙できますか?もしそうなら、変数名を文字列として出力できますか?プリプロセッサを使用していますか?

すべてのconstchar*メンバーがいるクラスがあります。各メンバー変数を列挙し、与えられた文字列キーに対して文字列として名前をチェックする洗練された方法があればよいでしょう。

これが使用できるコードの種類ですか?

誰かがこれを行う方法を考えることができますか?

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

他の人が言ったように、変数の名前は、コンパイラがコードのコンパイルを完了すると、生成されたコードには実際には存在しません。デバッグシンボルなどに存在する可能性がありますが、変数がどこにあるかを判断するために到達しようとするのは恐ろしい混乱です[コンパイラが現在レジスタまたはメモリの場所を使用して保存しているかどうかに応じて、異なる場所に存在する可能性がありますその値など]。

パラメータ内の名前に一致する文字列を生成するマクロを持つことは確かに可能です。

ただし、構成タイプのものには別のメカニズムを使用する方がおそらく良いでしょう-いくつかの明らかなオプションは次のとおりです。

  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 に答える
1

C++ では、変数の名前を文字列に変換することはできません。場合によっては、コンパイルされた実行可能ファイルに変数名さえ存在しないことがあります (スコープと可視性によって異なります)。

可能だったとしても、クラスのメンバーを列挙することはまだ不可能です。

この問題に対処する別の方法は、std::map"host" などの文字列をキーとして使用する代わりに を使用し、これを列挙することです。

于 2013-03-21T14:32:47.673 に答える
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 に答える