如何在C++中编写用户定义的流操作器来控制自写类的格式?
具体来说,我将如何编写简单的操作程序verbose
和terse
来控制输出流的数量?
我的环境是GCC,版本4.5.1及以上。
示例:
class A
{
...
};
A a;
// definition of manipulators verbose and terse
cout << verbose << a << endl; // outputs a verbosely
cout << terse << a << endl; // outputs a tersely
PS:下面的只是一个侧面的问题,你可以忽略它:这是否可以扩展到操纵者进行争论?Josuttis在13.6.1节末尾的“C++标准库”中写道,编写带有参数的操纵器是依赖于实现的。这仍然是真的吗?
发布于 2011-04-28 09:52:30
我不认为它们是依赖于实现的任何理由。
这是我使用的喜剧,对于实际操作程序,创建一个函数来返回以下助手的一个实例。如果您需要存储数据,只需将其存储在助手、某个全局变量、单例等中.
/// One argument manipulators helper
template < typename ParType >
class OneArgManip
{
ParType par;
std::ostream& (*impl)(std::ostream&, const ParType&);
public:
OneArgManip(std::ostream& (*code)(std::ostream&, const ParType&), ParType p)
: par(p), impl(code) {}
// calls the implementation
void operator()(std::ostream& stream) const
{ impl(stream,par); }
// a wrapper that allows us to use the manipulator directly
friend std::ostream& operator << (std::ostream& stream,
const OneArgManip<ParType>& manip)
{ manip(stream); return stream; }
};
基于此的机械手示例:
OneArgManip<unsigned> cursorMoveUp(unsigned c)
{ return OneArgManip<unsigned>(cursorMoveUpI,c); }
std::ostream& cursorMoveUpI(std::ostream& stream, const unsigned& c)
{ stream << "\033[" << c << "A"; return stream; }
请作一些解释:
<<
重载,后者调用助手上的()
操作符H 111
,该操作符调用原始机械手调用H 212
<
如果你想,我可以张贴2副和3副助理,以及。但原则是一样的。
https://stackoverflow.com/questions/5816568
复制相似问题