2013-11-01 63 views
0
int a = 1; 
int b = 2; 
int c = 3; 
std::string TakeFrom = "a"; 

如何從TakeFrom(在本例中爲a)讀取值並讀取像這樣的整數?例如,在上面的代碼中,我必須讀取a的值,因爲'a'是TakeFrom包含的值,所以我會得到「1」,但如果TakeFrom包含「b」,我會得到b的值(2)。從名稱在字符串上的整數中獲取值

+0

你不能確切的,但你可以使用一個'std :: map'來映射字符串(變量名)爲int。 – David

回答

0

如果abc必須留在當地int個S,你這樣做是乏味的,也就是這樣的唯一途徑:

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意味着a1意味着b,並2意味着c),你可以放置ab,並c到一個數組,並使用INT eger TakeFrom作爲索引。
  • 如果你願意只允許單字符變量,你可以用一個switch替換條件序列。
  • 如果您願意使用標準集合,請將單個變量替換爲字符串映射爲整數。
+0

你好,對於遲到回覆感到抱歉。感謝你的回答。這是最完整的,這是我必須做的。 – yop

0

由於存在單獨的變量,因此沒有簡單的方法(除了一系列if語句或同等語句)。

如果你把這三個變量變成一個單一的std::map<std::string,int>,情況會容易得多。

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; 
} 
相關問題