我有一个C ++类MyObject
,我希望能够像对待osstream那样提供这些数据(但与直接sstream不同,将传入数据格式化为特殊方式)。我似乎无法弄清楚如何为MyObject重载操作符来吃掉给它的输入。
class MyObject {
public:
ostringstream s;
FEEDME
};
int main() {
MyObject obj;
obj.FEEDME << "Hello" << 12345;
// I want obj.s == ":Hello::12345:"
}
我想要它所以送入的所有项目都包围着::
所以在给定的例子中,s =“:Hello :: 12345”应该是最终的结果。我的问题是,我怎样才能告诉对象,当<<something
时,放置::围绕着什么。
这可能吗?
答案 0 :(得分:10)
试试这个:
class MyObject {
public:
template <class T>
MyObject &operator<<(const T &x) {
s << ':' << x << ':';
return *this;
}
std::string to_string() const { return s.str(); }
private:
std::ostringstream s;
};
MyObject obj;
obj << "Hello" << 12345;
std::cout << obj.to_string() << std::endl;
有些事情你将无法推入流中,但它应该适用于所有基础知识。
答案 1 :(得分:1)
您可能会发现How do I create my own ostream/streambuf?的答案很有帮助。
答案 2 :(得分:1)
我会采用稍微不同的方法并创建一个格式化程序对象。
#include <iostream>
template<typename T>
class Format
{
public:
Format(T const& d):m_data(d) {}
private:
template<typename Y>
friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data);
T const& m_data;
};
template<typename T>
Format<T> make_Format(T const& data) {return Format<T>(data);}
template<typename T>
std::ostream& operator<<(std::ostream& str,Format<T> const& data)
{
str << ":" << data.m_data << ":";
}
int main()
{
std::cout << make_Format("Hello") << make_Format(123);
}