# C 中的宏运算符和 std::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
有没有办法向编译器提示哪个运算符 == 是使用 ?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
只需使用:
顺便说一句,使用双下划线是一个坏主意。
C++11 草案 n3290 将相关的运算符 == 定义为:
因此
compare
和==
在这里是相同的。Just use:
BTW, using double underscores is a bad idea.
The C++11 draft n3290 defines the relevant
operator==
as:so
compare
and==
are the same thing here.您始终可以转换为字符串,它应该可以工作。
请注意,我希望这里的
__STRING__
是std::string
。顺便说一句,5 个重载是什么?应该有一个专门用于
string
和const char*
的函数,它们不需要任何转换。You can always cast to string and it should work
Note that I expect
__STRING__
to be astd::string
here.BTW what are the 5 overloads? There should be one specifically for
string
andconst char*
, which shouldn't need any conversions.