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

AC.*_*AC. 6 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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它如下:

 Log(2, "INFO: setting variable \", 1, "\"\n");
Run Code Online (Sandbox Code Playgroud)

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

Ofi*_*fir 6

使用<<会更有意义,逗号通常不意味着流操作并且会导致令人困惑的代码


K-b*_*llo 4

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

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

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

  • @John:如果没有_variadic function templates_,您就无法使用相同的语法获得相同的行为。也就是说,我认为语法最好是一系列“&lt;&lt;”操作。但是编写该代码的人有所不同,并且找到了一个聪明的解决方案来解决他认为是问题的问题......如果你问我的话,**太**聪明了 (2认同)