这是逗号操作符的可接受用法吗?
Is this an acceptable use of the comma operator?
我看过其他关于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
相关文章:
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- C++:实现定义了可接受的物理源文件字符
- 二进制 '=':未找到采用右操作数的运算符(或者没有可接受的对话)
- 错误 C2679:二进制'<<':找不到采用类型 'overloaded-function' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 是否有一种可接受的运行线程或按顺序执行的方法
- 错误 C2678:二进制"+":未找到采用类型 'volatile A' 的左侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679:二进制"<<":未找到采用类型 'mystring' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679:二进制'>':找不到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679 二进制"=":未找到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679 二进制"=":未找到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 运算符重载:简单添加...错误 C2677:二进制"+":未找到采用类型 ___ 的全局运算符(或者不存在可接受的转换)
- C2679:二进制"<<":未找到采用类型为"student"的右操作数的运算符(或没有可接受的转换)
- 带有模板类的赋值运算符 - 没有可接受的转换,C++
- 我正在尝试检查可接受的身高和体重,并让 c++ 编译器输出候选人被拒绝的原因
- 公开对象管理器对象的可接受方法?
- 错误 C2677:二进制'+=':找不到采用类型 'Movie' 的全局运算符(或者没有可接受的转换)
- 这是逗号操作符的可接受用法吗?