这是逗号操作符的可接受用法吗?

Is this an acceptable use of the comma operator?

本文关键字:可接受 用法 操作符      更新时间:2023-10-16

我看过其他关于Stack Overflow的帖子,这些帖子非常反对逗号操作符的重载。我收到了一个Github拉请求,其中包含一个逗号操作符过载,看起来像下面这样:

class Mylogger {
    public:
            template <typename T>
            Mylogger & operator,(const T & val) {
                    std::cout << val;
                    return * this;
            }
 };
 #define  Log(level,args...)  
    do { Mylogger logv; logv,level, ":", ##args; } while (0)

那么你可以这样使用:

 Log(2, "INFO: setting variable ", 1, ""n");

谁能解释一下为什么这是一个好的或坏的用例?

使用<<会更有意义,逗号通常不表示流操作,会导致代码混乱

这是主观的,但我想说这不是一个很好的用例,因为它传达了错误的语义。已经有一个操作符用于输出,<<将是一个更好的选择。

代码利用了可变宏和重载逗号操作符,这很聪明,对于特定情况可能很好。然而,如果要创建一个Mylogger对象,那么重载操作符就会令人困惑,并导致各种各样的麻烦。

所以,至少,如果Mylogger是一个实现细节,那么它可能是一个有效的用例。现在,在 c++ 11中,使用可变函数模板,就不需要使用这种扭曲的代码了。

操作符重载应该只在对类的调用者/用户非常透明的情况下才进行。当有疑问时,只需创建一个做您想做的事情的方法,并根据良好的命名约定对其命名。逗号通常没有标准化的用法,所以添加一个逗号操作符会让你的类的用户摸不着头脑。

最近,我成了Google风格指南的粉丝,它不是任何操作符重载的超级粉丝。他们有一些很好的理由,你可以在这里了解:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading

相关文章: