我有一些代码可以帮助我将enum转换为字符串,反之亦然。
所以我写了一个宏来让它看起来更好更简单:
#define SMART_REVERT_CASE(__CODE__, __STRING__)\
if (__STRING__ == #__CODE__) return __CODE__
然后我这样称呼它:
enum EXAMPLE { HELLO, GOODBYE, ERROR };
EXAMPLE StringToExample(std::string const& input)
{
SMART_REVERT_CASE(HELLO, input);
SMART_REVERT_CASE(GOODBYE, input);
return ERROR;
}
不幸的是它没有编译(在VS 2008上):
Error 1 error C2666: 'operator ==' : 5 overloads have similar conversions
有没有办法向编译器提示哪个运算符==要使用?
答案 0 :(得分:4)
只需使用:
__STRING__.compare( #__CODE__ )
BTW,使用双下划线是一个坏主意。
C ++ 11草案n3290将相关的operator==
定义为:
template<class charT, class traits, class Allocator>
bool operator==(const basic_string<charT,traits,Allocator>& lhs,
const charT* rhs) noexcept;
需要: rhs指向至少traits :: length(rhs)+ charT的1个元素的数组。
返回: lhs.compare(rhs)== 0。
所以compare
和==
在这里是相同的。
答案 1 :(得分:1)
你总是可以转换成字符串,它应该可以工作
#define SMART_REVERT_CASE(__CODE__, __STRING__)\
if (__STRING__ == std::string(#__CODE__)) return __CODE__
请注意,我希望此处__STRING__
为std::string
。
string
和const char*
的内容,不需要任何转换。