为什么输出运算符'os<<值'而不是'值>> OS'?

时间:2011-08-13 18:48:03

标签: c++

我正在学习流式传输。标准流提供<<运算符,可以声明为:

ostream& operator<<(stream& os, CLASS& rc);  

为什么不可能将其声明为此?

ostream& operator>>(CLASS& rc, stream& os); 

然后我可以做类似的事情:

rc.something >> os;

作为其实施的一部分。


编辑,因为人们已帮助我了解更多相关信息,我很感激。

但是我仍然坚持如何实现它。

我试过了

ostream& operator >> (const SomeClass& refToCls, stream& os)
{
   refToCls.iVar >> os;
   return os;
}

但它失败了。我该如何解决?

2 个答案:

答案 0 :(得分:7)

事实上,可以定义

ostream& operator>>(CLASS& rc, ostream& os);

但是你必须像这样链接它:

a >> (b >> (c >> str));

>>运算符是左关联的,因此默认情况下为:

a >> b >> c >> str;

相当于:

((a >> b) >> c) >> str;

其含义错误。

答案 1 :(得分:1)

以下是如何在不担心关联性的情况下执行此操作,使用帮助程序类来收集输入,然后将其发送到ostream:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>

class ReversePrinter
{
    std::string acc;
public:
    template <class T>
    ReversePrinter(const T& value)
    {
        *this >> value;
    }

    template <class T>
    ReversePrinter& operator>>(const T& value)
    {
        std::stringstream ss;
        ss << value;
        acc += ss.str();
        return *this;
    }
    std::ostream& operator>>(std::ostream& os)
    {
        std::reverse(acc.begin(), acc.end());
        return os << acc;
    }
};

struct R
{
    template <class T>
    ReversePrinter operator>>(const T& value) {
        return ReversePrinter(value);
    }
};

int main()
{
    std::string name = "Ben";
    int age = 14;
    const char* hobby = "reading backwards";
    R() >> "Hello, my name is " >> name >> "\nI'm " 
        >> age >> " years old and I like " >> hobby >> std::cout;
}