首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为流自写类编写用户定义的操作器

如何为流自写类编写用户定义的操作器
EN

Stack Overflow用户
提问于 2011-04-28 09:37:32
回答 1查看 3.7K关注 0票数 8

如何在C++中编写用户定义的流操作器来控制自写类的格式?

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

我的环境是GCC,版本4.5.1及以上。

示例:

代码语言:javascript
运行
复制
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++标准库”中写道,编写带有参数的操纵器是依赖于实现的。这仍然是真的吗?

EN

回答 1

Stack Overflow用户

发布于 2011-04-28 09:52:30

我不认为它们是依赖于实现的任何理由。

这是我使用的喜剧,对于实际操作程序,创建一个函数来返回以下助手的一个实例。如果您需要存储数据,只需将其存储在助手、某个全局变量、单例等中.

代码语言:javascript
运行
复制
    /// 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; }
    };

基于此的机械手示例:

代码语言:javascript
运行
复制
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; }

请作一些解释:

  1. u使用机械手,该机械手返回绑定到助手
  2. 流的实现的一个新实例来处理该助手,该操作程序调用助手
  3. 上的<<重载,后者调用助手

上的()操作符H 111,该操作符调用原始机械手调用H 212<

  1. >G 213传递的参数来调用助手的实际实现。

如果你想,我可以张贴2副和3副助理,以及。但原则是一样的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5816568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档