0
int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";

TakeFrom から値 (この場合は a) を取得し、そのような名前の整数を読み取るにはどうすればよいでしょうか? たとえば、上記のコードでは、「a」は TakeFrom に含まれているため、「1」を取得しますが、TakeFrom に「b」が含まれている場合は、b の値 (2) を取得するため、a の値を読み取る必要があります。

4

3 に答える 3

1

通常の C/C++ 条件では、変数名はコンパイル中に指定されたスコープに対してのみ存在し、特定のメモリ位置/レジスタを参照するための基本的に人間が判読できるニーモニックです。

C/C++ には最小限のリフレクション機能がないため、実行時に名前で変数を参照したり、変数の場所/値で変数の名前を検索したりする組み込みの方法はありません。

説明している問題を解決するには、いくつかの簡単なオプションがあります。

int value;
if (TakeFrom == "a") {
     value = a;
} else if (TakeFrom == "b") {
     value = b;
} ...

また

switch (TakeFrom[0]) {
    case 'a':
        value = a;
    break;
    case 'b':
        value = b;
    break;
}

またはルックアップテーブルを使用できます

int a = 1, b = 2, c = 3;
struct Lookup {
    int&         m_variable;
    const char*  m_name;
};
static const size_t NumLookups = 3;
Lookup lookups[NumLookups] = { { a, "a" }, { b, "b" }, { c, "c" } };
for (size_t i = 0; i < NumLookups; ++i) {
    if (TakeFrom == lookups[i].m_name)
        value = lookups[i].m_variable;
}
于 2013-11-01T20:48:09.720 に答える
0

ab、およびcがローカル s にとどまらなければならない場合、intそれを行う唯一の方法は退屈なものです。つまり、次のようになります。

int val;
if (TakeFrom == "a") {
    val = a;
} else if (TakeFrom == "b") {
    val = b;
} else if (TakeFrom == "c") {
    val = c;
} else {
    // It's an error
}

いくつかの変更を受け入れる場合は、いくつかのことができます。

  • を「エンコード」してTakeFrom、文字列ではなく整数にする場合 (たとえば、0means a1means b、および2means c)、ab、およびcを配列に配置し、整数TakeFromをインデックスとして使用できます。
  • 単一文字の変数のみを許可する場合は、一連の条件を単一のswitch.
  • 標準コレクションを使用する場合は、個々の変数を文字列から整数へのマップに置き換えます。
于 2013-11-01T20:50:13.010 に答える