c++ io manipulator

来源:互联网 发布:双流区2016年公交优化 编辑:程序博客网 时间:2024/09/21 08:57

c++ io manipulator

I use this kind of io manipular now and then.
std::cout << std::setw(8) << std::setfill('0') 

Let's look at std::setw first,  it's defined as:
_MRTIMP2 _Smanip<streamsize> __cdecl setw(streamsize wide){// manipulator to set widthreturn (_Smanip<streamsize>(&swfun, wide));}

swfun is the function which do the real job, it will call cout.width(wide), it's defined as:

// FUNCTION setwstatic void __cdecl swfun(ios_base& iostr, streamsize wide){// set widthiostr.width(wide);}

Now let's look at _Smanip, it's a simple template struct, it contains a function pointer which will set  property  of ios_base and an template arg
// TEMPLATE STRUCT _Smaniptemplate<class _Arg>struct _Smanip{// store function pointer and argument value_Smanip(void (__cdecl *_Left)(ios_base&, _Arg), _Arg _Val): _Pfun(_Left), _Manarg(_Val){// construct from function pointer and argument value}void (__cdecl *_Pfun)(ios_base&, _Arg);// the function pointer_Arg _Manarg;// the argument value};
In this case _Pfun is swfun,  _arg is wide
At last , iomanip override operator<<
template<class _Elem,class _Traits,class _Arg> inlinebasic_ostream<_Elem, _Traits>& operator<<(basic_ostream<_Elem, _Traits>& _Ostr, const _Smanip<_Arg>& _Manip){// insert by calling function with output stream and argument(*_Manip._Pfun)(_Ostr, _Manip._Manarg);return (_Ostr);}

In short, iomanipular define a function which do the set job,  put this function and arg in a template struct, then override operator<< , get function pointer and arg from this 
struct, then set property of ios.





0 0
原创粉丝点击