是否为静态类重载了ostream <<运算符?

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)

但是,<<操作符需要一个实例,但实际上不存在此全局类的实例。有没有办法解决?

谢谢你的帮助。

Pav*_*aev 5

首先,您不能使用类名作为值-它根本不是一个。因此,您必须引入一个不同的名称以供使用<<-例如,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希望它更通用的情况下提供模板功能。