jam*_*ieQ 2 c++ operator-overloading
我有一个(简化的)静态全局类和<<操作符重载,如下所示:
class Global
{
private:
static int counter;
Global(){};
public:
friend ostream& operator<<(ostream &out, Global &global);
}
ostream& operator<< (ostream &out, Global &global)
{
//... do output
return out;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够将静态引用传递给cout:
cout << Global
Run Code Online (Sandbox Code Playgroud)
但是,<<操作符需要一个实例,但实际上不存在此全局类的实例。有没有办法解决?
谢谢你的帮助。
首先,您不能使用类名作为值-它根本不是一个。因此,您必须引入一个不同的名称以供使用<<-例如,global(使用小写的“ g”)。
通常,如果要在不定义对象的情况下引入“ streamable”名称,则应编写一个流操纵器:
std::ostream& foo(std::ostream& out)
{
out << "foo";
return out;
}
Run Code Online (Sandbox Code Playgroud)
这里的技巧是流具有重载的运算符,<<这样,如果您将函数指针传递给它,并且该函数接收并返回一个流,则<<相当于将函数应用于该流。换句话说,您可以编写:
std::cout << 123 << foo << 456;
Run Code Online (Sandbox Code Playgroud)
它将与以下相同:
foo(std::cout << 123) << 456;
Run Code Online (Sandbox Code Playgroud)
std::endl例如,它是如何实现的。
同样的事情也适用于>>,您可以在basic_istream和/或basic_ostream希望它更通用的情况下提供模板功能。