# C 中的宏运算符和 std::string 比较++

发布于 2024-12-13 19:22:51 字数 591 浏览 0 评论 0原文

我有这段代码可以帮助我将枚举转换为字符串,反之亦然。

所以我写了一个宏,让它看起来更好更简单:

#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   

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

I have this bit of code that helps me convert enum to string and vice versa.

So I wrote a macro to make it look better and simpler:

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

And then I call it this way:

enum EXAMPLE { HELLO, GOODBYE, ERROR };
EXAMPLE StringToExample(std::string const& input)
{
  SMART_REVERT_CASE(HELLO, input);
  SMART_REVERT_CASE(GOODBYE, input);
  return ERROR;

}

Unfortunately it does not compile (on VS 2008):

Error   1   error C2666: 'operator ==' : 5 overloads have similar conversions   

Is there a way to give a hint to the compiler as to which operator== to use ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

方圜几里 2024-12-20 19:22:51

只需使用:

__STRING__.compare( #__CODE__ )

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

C++11 草案 n3290 将相关的运算符 == 定义为:

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== 在这里是相同的。

Just use:

__STRING__.compare( #__CODE__ )

BTW, using double underscores is a bad idea.

The C++11 draft n3290 defines the relevant operator== as:

template<class charT, class traits, class Allocator>
  bool operator==(const basic_string<charT,traits,Allocator>& lhs,
                  const charT* rhs) noexcept;

Requires: rhs points to an array of at least traits::length(rhs) + 1 elements of charT.
Returns: lhs.compare(rhs) == 0.

so compare and == are the same thing here.

只有一腔孤勇 2024-12-20 19:22:51

您始终可以转换为字符串,它应该可以工作。

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

请注意,我希望这里的 __STRING__std::string

顺便说一句,5 个重载是什么?应该有一个专门用于 stringconst char* 的函数,它们不需要任何转换。

You can always cast to string and it should work

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

Note that I expect __STRING__ to be a std::string here.

BTW what are the 5 overloads? There should be one specifically for string and const char*, which shouldn't need any conversions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文