c++ - 如何正确定义和调用原始运算符<<

标签 c++ operator-overloading

考虑以下示例:

#include <iostream>

class A {
    const int i;
    const int j;

public:
    A(int i_, int j_) : i(i_), j(j_) {}

    std::ostream& operator<<(std::ostream& o) const {
       o << "i is " << i << ", j is " << j;
       return o;
    }
};

std::ostream& operator<<(std::ostream& o, const A& a ) {
    o << "This is A: ";
    a.operator<<(o);

    return o;
}

int main() {
    A a(0,42);

    std::cout << a << std::endl;
    return 0;
}

它将生成以下输出:

This is A: i is 0, j is 42

输出是正确的,但我不喜欢我如何调用 A 的原始 operator<< .

我正在尝试弄清楚如何正确定义该运算符,以便可以这样调用它:

o << "This is A: " << (some magic)a;

代替

o << "This is A: ";
a.operator<<(o);

我尝试了各种方法,但要么遇到歧义问题,要么获取 std::cout 的地址和断弦。请注意结果 std::ostream&A::operator<<是我测试的残余。在上面的示例中,使用 void 就足够了.

是否可以不创建从类 A 派生并定义自己的运算符 << ( class NiceOutputOfA : public A {...}; ) 的中间类 B?

最佳答案

类内定义的二元运算符始终将类作为左侧操作数。这意味着您不能在类里面实现流插入/提取。

可能最常见的方法是将运算符实现为 friend在类中内联定义。

另一种相当常见的方法是在类中提供一个命名的流函数,以及调用该函数的类外流运算符。您几乎做到了,但是将该函数命名为 operator << .

关于c++ - 如何正确定义和调用原始运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010311/

相关文章:

c++ - 寻求对 std::forward 的澄清

c++ - C++ 中有一些更智能的智能指针吗?

c++ - 如何为按需构造其值的迭代器实现 operator->?

C++ 指向重载索引的箭头 ( this->[ ] )

java - 为什么编译器不能处理无法访问的代码?

c++ - 将目录添加到不带CMakeLists.txt的CMake项目中

c++ - 在 C++ 中覆盖 OpenGL 的纹理包装器

c++ - 重载内置类型的运算符

c++ - 运算符上的右值引用模板参数推导

C# 到 Mono GetConsoleWindow 异常