作為一個C++程序員,或是出於習慣,或是出於無奈,你多少次這麼寫:
if (!strcmp(pszValue, "Value X"))
DoThis();
else if (!strcmp(pszValue, "Value Y"))
DoThat();
else if (!strcmp(pszValue, "Value Z"))
DoSomethingElse();
else
DontKnowWhatToDo();
你千百次的問,如果這個時候可以使用switch多好呢?
switch(strValue)
{
case "Value X":
DoThis();
break;
case "Value Y":
DoThat();
break;
case "Value Z";
DoSomethingElse();
break;
default:
DontKnowWhatToDo();
break;
上面這段代碼在C Sharp中是合法的,但是作為一個C++程序員,你只能無奈和無奈。
下面就是用enum和std::map完成這個願望!
#include
這裡有個特別重要的技巧,那就是為什麼把enumeration的第一個設為evNotDefined ?
首先我們要明確std::map::operator[] 的作用:
1 設置一個key的value
2 取值。這個時候需要注意,若不存在,才會被插入。
即程序中對於s_mapStringValues,如果szInput 是新的,將會被插入。
並且 the value默認為0 。
如果enumeration第一項為evStringValue1,任何一個未知的string value 都會導致一個有效的switch case。所以我們才這麼干。
==============================================================
這裡還有個小問題 討論一下,就是switch語句中return厲害還是break厲害:
代碼:
switch(s_mapStringValues[szInput])
{
case evStringValue1:
cout << "Detected the first valid string." << endl;
return 0;//還會執行break嗎?
break;
case evStringValue2:
cout << "Detected the second valid string." << endl;
break;
case evStringValue3:
cout << "Detected the third valid string." << endl;
break;
case evEnd:
cout << "Detected program end command. "
<< "Programm will be stopped." << endl;
return(0);
default:
cout << "'" << szInput
<< "' is an invalid string. s_mapStringValues now contains "
<< s_mapStringValues.size()
<< " entries." << endl;
break;
}
測試,表面,return了 就不會break了。