c++中的宏操作符和std::字符串比较

# macro operator and std::string comparison in C++

本文关键字:std 字符串 比较 操作符 c++      更新时间:2023-10-16

这段代码可以帮助我将enum转换为string,反之亦然

所以我写了一个宏让它看起来更好更简单:
#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   

是否有一种方法可以提示编译器使用哪个操作符== ?

直接使用:

__STRING__.compare( #__CODE__ )

顺便说一句,使用双下划线是个坏主意。

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) + 1个charT元素的数组。
返回: lhs.compare(rhs) == 0.

所以compare==在这里是一样的

你总是可以转换为string,它应该工作

#define SMART_REVERT_CASE(__CODE__, __STRING__)
     if (__STRING__ == std::string(#__CODE__)) return __CODE__

请注意,我希望__STRING__在这里是std::string

顺便说一句,5个超载是什么?应该有一个专门针对stringconst char*的,不需要任何转换。