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)
有人可以解释为什么这是一个好的或坏的用例?
这是主观的,但我想说这不是一个好的用例,因为它传达了错误的语义。已经有一个用于输出的运算符,<<将是更好的选择。
该代码利用了可变参数宏和重载的逗号运算符,这很聪明,并且可能适合特定情况。然而,如果在哪里创建Mylogger对象,那么重载的运算符就会令人困惑并导致各种麻烦。
因此,至少,如果Mylogger是一个实现细节,那么它可能是一个有效的用例。现在,在具有可变函数模板的C++11中,无需诉诸这种扭曲的代码。