编写自己的流操作程序 经典代码

简介:
  自己写程序实现一个流操作符来完成流操作或者标准流不能完成的工作。或者自己自己写程序实现单个操作符来在一个流上设置多个标志而不是每次都调用多个操作符。
  下面请看一个简单的流操作程序:
#include <iostream>
#include < string>

  using  namespace std;

  inline ios_base& floatnormal(ios_base& io) {
  io.setf(0, ios_base::floatfield);
  io.precision(4);
  io.width(10);
   return io;
}

  int main()
{
  ios_base::fmtflags flags = cout.flags();   //保存原有的流标志

   double pi = 3.14159265;
  cout <<  "pi=" << floatnormal << pi << std::endl;

  cout.flags(flags);     //恢复原有的流标志
   return 0;
}
  这里需要注意的是要保存原有的流标志,因为一旦使用流操作后,后续的流标志都会被修改,setw()除外。因此需要恢复原有的流标志,当然如果后续的流操作都使用相同的格式,不需要恢复。
  从这段代码代码可以看出,写字的流操作程序看起来是很简单的。但是如果要编写带有参数的的流操作呢?如:floatnormal(n),该如何编写呢?这就比较复杂了,而且要想写通用一些,更加需要较深的编程经验。
  笔者在这里有一个例子,供大家参考。这段代码比较经典,使用模板和函数指针也比较出色。
#include <iostream>
#include < string>

  using  namespace std;

  template<typename T, typename C>
class ManipInfra
{
   private:
    T val_;
    basic_ostream<C>& (*manipFun_)(basic_ostream<C>&, T );

   public:
    ManipInfra(basic_ostream<C>& (*pFun)(basic_ostream<C>&, T), T val)
      : manipFun_ (pFun), val_(val){
    }

     void  operator()(basic_ostream<C>& os)  const {
      manipFun_(os, val_);
    }
};

  template<typename T, typename C>
basic_ostream<C>&  operator<<(basic_ostream<C>& os,  const ManipInfra<T, C>& manip) {
  manip(os);
   return os;
}

  ostream& setTheWidth(ostream& os,  int n) {
  os.width(n);
   return os;
}

  ostream& setTheFill(ostream& os,  char c) {
  os.fill(c);
   return os;
}

  ManipInfra< intchar> setWidth( int n) {
   return ManipInfra< intchar>(setTheWidth, n);
}

  ManipInfra< charchar> setFill( char c) {
   return ManipInfra< charchar>(setTheFill, c);
}

  int main()
{
  cout << setFill('*') << setWidth(19) << right <<  "djf\n";
   return 0;
}



     本文转自panpan3210 51CTO博客,原文链接:http://blog.51cto.com/panpan/116853 ,如需转载请自行联系原作者



相关文章
|
4月前
|
存储 Java
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
|
6月前
|
存储 前端开发 rax
不一样的编程方式 —— 协程(设计原理与汇编实现)
不一样的编程方式 —— 协程(设计原理与汇编实现)
|
XML 机器学习/深度学习 JSON
|
自然语言处理 Java API
都2023年了,如果不会Stream流、函数式编程?你确定能看懂公司代码?
都2023年了,如果你不会Stream流、函数式编程?你确定能看懂同事写的代码? 那么建议来了解一下Stream流, 因为它使用简单,易操作,易上手而代码简洁,开发快速,一看就令人很爽😎😎😎 . 其实Stream流式编程表达式接近自然语言,易于理解 , 集万千优点与一身, 语法优美👉👉👉.下面来简单认识一下今天的主角Stream流吧
117 0
|
Java
10、JAVA入门——多重循环及程序调试
10、JAVA入门——多重循环及程序调试
199 0
10、JAVA入门——多重循环及程序调试
编程小技巧8-优化日志对象创建代码
编程小技巧8-优化日志对象创建代码
103 0
|
Java 数据库连接 数据库
编写Java程序,在维护英雄数据的业务过程中复用数据库操作封装类
编写Java程序,在维护英雄数据的业务过程中复用数据库操作封装类
114 0