Well, I\'m new to operator overloading, and I found this problem. Instead of documenting myself, I prefer to ask you :D
The point is, I know how to do simple operator ov
It's quite easy, don't panic :)
You have recognized the problem well: it's very similar to the std::cout
- std::endl
work.
You could do like such, though I'll rename the types, if you don't mind.
struct EndMarker {};
extern const EndMarker end; // To be defined in a .cpp
class Data
{
public:
Data(): m_data(1, "") {}
// Usual operator
template
Data& operator<<(const T& input)
{
std::ostringstream aStream;
aStream << input;
m_data.back() += aStream.str();
};
// End of object
Data& operator<<(EndMarker) { m_data.push_back(""); }
private:
std::vector m_data;
}; // class Data
It works by adding to the current last element by default, and pushing an empty element at the end.
Let's see an example:
Data data;
data << 1 << "bla" << 2 << end << 3 << "foo" << end;
// data.m_data now is
// ["1bla2", "3foo", ""]
The other solution would be to keep a flag (boolean) to store if a end
has been streamed or not, and if it has, creating a new element on the next insertion (and erasing the flag).
It a bit more work on insertion, but you don't have the empty element... your call.