[英]Get value from integer whose name is on a string
int a = 1;
int b = 2;
int c = 3;
std::string TakeFrom = "a";
如何從TakeFrom(在這種情況下為a)獲取值,並讀取像這樣命名的整數? 例如,在上面的代碼中,我將必須讀取a的值,因為TakeFrom包含'a',因此我將獲得“ 1”,但是如果TakeFrom包含“ b”,則將獲得b的值(2)。
在正常的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;
}
有了單獨的變量,沒有簡單的方法(一系列if
語句或等效語句除外)。
如果將三個變量轉換為單個std::map<std::string,int>
,事情會容易得多。
如果a
, b
和c
必須保留本地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
表示a
, 1
表示b
和2
表示c
),則可以將a
, b
和c
放入數組中,並且使用整數TakeFrom
作為索引。 switch
替換條件條件序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.