int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";
TakeFrom から値 (この場合は a) を取得し、そのような名前の整数を読み取るにはどうすればよいでしょうか? たとえば、上記のコードでは、「a」は TakeFrom に含まれているため、「1」を取得しますが、TakeFrom に「b」が含まれている場合は、b の値 (2) を取得するため、a の値を読み取る必要があります。
通常の 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;
}
a
、b
、および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
、文字列ではなく整数にする場合 (たとえば、0
means a
、1
means b
、および2
means c
)、a
、b
、およびc
を配列に配置し、整数TakeFrom
をインデックスとして使用できます。switch
.