6

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

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

4

3 回答 3

6

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

于 2012-12-31T20:45:29.233 回答
4

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

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

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

于 2012-12-31T20:46:41.490 回答
0

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

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

于 2013-07-28T08:46:41.467 回答