我正在学习流式传输。标准流提供<<
运算符,可以声明为:
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;
}
但它失败了。我该如何解决?
答案 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;
}