在C ++中使用#macro operator和std :: string比较

时间:2011-11-04 10:31:38

标签: c++ macros stdstring

我有一些代码可以帮助我将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   

有没有办法向编译器提示哪个运算符==要使用?

2 个答案:

答案 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

BT有什么5个重载?应该有一个专门针对stringconst char*的内容,不需要任何转换。