C++中没有专门为enum与字符串或CString互相转换的直接方法,但是工作中会常遇到相互转换的场景。下面介绍一种自己实现的方法,首先得定义一个enum类型,同时,定义一个与之对应的字符串类型,然后,可以相互转换了。
enum E_ANIMAL {
E_ANIMAL_EAGLE = 0,
E_ANIMAL_MAGPIE,
E_ANIMAL_PIG,
E_ANIMAL_CARP,
E_ANIMAL_END
};
const CString ANIMAL[] = {
"E_ANIMAL_EAGLE",
"E_ANIMAL_MAGPIE",
"E_ANIMAL_PIG",
"E_ANIMAL_CARP",
"E_ANIMAL_END"
};
bool fnConverCStringToEnum(const CString csParam,E_ANIMAL &eName)
{
CString csAnimalName;
int iCount = 0;
eName = E_ANIMAL_END;
csAnimalName = csParam;
iCount = sizeof(ANIMAL) / sizeof(ANIMAL[0]);
for(int i=0;i<iCount;i++)
{
if(0 == csAnimalName.CompareNoCase(ANIMAL[i]))
{
eName = E_ANIMAL(i);
break;
}
else
{
continue;
}
if(E_ANIMAL_END == eName)
{
return false;
}
}
cout << "eName is: " << eName << endl;
return true;
}
bool fnConverEnumToCString(const E_ANIMAL eParam,CString &csName)
{
E_ANIMAL eTemp = E_ANIMAL_END;
int idx = 0;
if(eParam > E_ANIMAL_END)
{
return false;
}
eTemp = eParam;
idx = static_cast<enum>(eTemp);
csName = ANIMAL[idx];
cout << "csName is: " << csName.GetBuffer(0) << endl;
return true;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString csAnimalName;
E_ANIMAL eAnimalName;
if(!fnConverEnumToCString(E_ANIMAL_CARP,csAnimalName))
{
return false;
}
if(!fnConverCStringToEnum("E_ANIMAL_CARP",eAnimalName))
{
return false;
}
cout << "csAnimalName is: " << csAnimalName.GetBuffer(0) << endl;
cout << "eAnimalName is: " << eAnimalName << endl;
}
return nRetCode;
}