# макрооператор и сравнение std :: string в C ++ - PullRequest
1 голос
/ 04 ноября 2011

У меня есть этот бит кода, который помогает мне преобразовать 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 ]

4 голосов
/ 04 ноября 2011

Просто используйте:

__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 указывает на массив из как минимум признаков: length (rhs) + 1 элемента charT.
Возвращает: lhs.сравнить (rhs) == 0.

, поэтому compare и == - это одно и то же.

1 голос
/ 04 ноября 2011

Вы всегда можете привести к строке, и это должно работать

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

Обратите внимание, что я ожидаю, что __STRING__ будет std::string здесь.

Кстати, каковы 5 перегрузок? Должно быть одно специально для string и const char*, для которых не нужно никаких преобразований.

...