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 width
return (_Smanip<streamsize>(&swfun, wide));
}
// FUNCTION setw
static void __cdecl swfun(ios_base& iostr, streamsize wide)
{ // set width
iostr.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 _Smanip
template<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> inline
basic_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.
struct, then set property of ios.