我在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");
有人可以解释为什么这是一个好的或坏的用例?
答案 0 :(得分:6)
使用&lt;&lt;会更有意义,逗号通常不代表流操作,会导致代码混乱
答案 1 :(得分:4)
这是主观的,但我会说这不是一个好用例,因为它传达了错误的语义。已经有一个用于输出的运算符,<<
将是更好的选择。
代码利用了可变参数宏和重载的逗号运算符,这很聪明,可能适用于特定情况。但是,如果在哪里创建Mylogger
对象,那么重载的运算符会混淆并导致各种麻烦。
所以,至少,如果Mylogger
是一个实现细节,那么它可能是一个有效的用例。现在在 C ++ 11 中使用可变参数函数模板,不需要求助于这种扭曲的代码。
答案 2 :(得分:0)
当使用对您的类的调用者/用户非常透明时,仅 运算符重载。如果有疑问,只需创建一个执行所需操作的方法,并根据良好的命名约定命名。逗号通常没有标准化的用法,因此添加逗号运算符会让您的班级用户挠头。
最近,我已成为Google风格指南的粉丝,这不是任何运营商重载的忠实粉丝。他们有一些很好的理由可以在这里了解:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading