码迷,mamicode.com
首页 > 编程语言 > 详细

c++ io manipulator

时间:2015-02-07 11:48:39      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:c++   iomanip   cout   io   ostream   

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

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

		// 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.





c++ io manipulator

标签:c++   iomanip   cout   io   ostream   

原文地址:http://blog.csdn.net/peanutandchestnut/article/details/43601619

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!