如何用C++编写用户定义的流操纵器,以控制流式自写类的格式?

具体来说,我将如何编写简单的操纵器verboseterse来控制流输出的数量?

我的环境是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++标准库”中写道,编写带参数的操纵器与实现有关。这仍然是真的吗?

最佳答案

我认为他们没有任何理由依赖于实现。

对于实际的操纵器,我使用此功能来创建一个函数,该函数返回以下帮助器的实例。如果您需要存储数据,只需将其存储在帮助器,一些全局变量,单例等内部...

    /// 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; }

对于一些解释:
  • 您使用操纵器,该操纵器返回绑定(bind)到助手
  • 实现的助手的新实例
  • 流尝试处理助手,该助手在助手
  • 上调用<<重载
    在帮助程序上调用()运算符的
  • 使用从原始操纵器调用
  • 传递的参数来调用帮助程序的实际实现

    如果您愿意,我也可以发布2个param和3个param helper。原理是一样的。

    09-04 09:51