这是逗号运算符的可接受用法吗?

时间:2012-12-31 20:42:04

标签: c++ operator-overloading

我在Stack Overflow上看过其他帖子,这些帖子极力阻止逗号运算符的重载。我收到了一个带有逗号运算符重载的Github pull请求,看起来如下所示:

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");

有人可以解释为什么这是一个好的或坏的用例?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

代码利用了可变参数宏和重载的逗号运算符,这很聪明,可能适用于特定情况。但是,如果在哪里创建Mylogger对象,那么重载的运算符会混淆并导致各种麻烦。

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

答案 2 :(得分:0)

当使用对您的类的调用者/用户非常透明时, 运算符重载。如果有疑问,只需创建一个执行所需操作的方法,并根据良好的命名约定命名。逗号通常没有标准化的用法,因此添加逗号运算符会让您的班级用户挠头。

最近,我已成为Google风格指南的粉丝,这不是任何运营商重载的忠实粉丝。他们有一些很好的理由可以在这里了解:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading