gpt4 book ai didi

c++ - 如何为流式自写类编写用户定义的操纵器

转载 作者:可可西里 更新时间:2023-11-01 17:58:58 33 4
gpt4 key购买 nike

如何在 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:下面只是一个附带问题,请忽略它:这是否可以移植地扩展到 manipulators taking arguments? Josuttis 在“The C++ Standard Library”中靠近第 13.6.1 节末尾的部分写道,编写采用参数的操纵器取决于实现。这仍然是真的吗?

最佳答案

我看不出有任何理由让它们依赖于实现。

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

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

一些解释:

  1. 你使用操纵器,它返回绑定(bind)到助手实现的助手的新实例
  2. stream 尝试处理调用 << 的助手 helper 重载
  3. 调用 ()助手上的运算符
  4. 使用从原始操纵器调用传递的参数调用助手的实际实现

如果您愿意,我也可以发布 2 个参数和 3 个参数的助手。原理是一样的。

关于c++ - 如何为流式自写类编写用户定义的操纵器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816568/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com