編寫本身的流操做程序 經典代碼

  本身寫程序實現一個流操做符來完成流操做或者標準流不能完成的工做。或者本身本身寫程序實現單個操做符來在一個流上設置多個標誌而不是每次都調用多個操做符。
  下面請看一個簡單的流操做程序:
#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< int, char> setWidth( int n) {
   return ManipInfra< int, char>(setTheWidth, n);
}

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

  int main()
{
  cout << setFill('*') << setWidth(19) << right << "djf\n";
   return 0;
}
相關文章
相關標籤/搜索