您的位置:首页 > 数码 > MP3 > c++标准库中endl的实现(转) - Tinysun - BlogJava

c++标准库中endl的实现(转) - Tinysun - BlogJava

luyued 发布于 2011-06-07 09:27   浏览 N 次  

常用链接我参与的团队

随笔分类

随笔档案

收藏夹

C++ 社区

常用网站

搜索阅读排行榜评论排行榜以前一直没有关心std::endl的工作机制,最近突然想一窥究竟,于是下载了sgi的stl(http://www.sgi.com/tech/stl/)实现,
于是恍然大悟,对其实现者真是敬佩。

在文件Ostream中class basic_ostream 有如下成员函数:

basic_ostream& operator<< (basic_ostream& (*__f)(basic_ostream&))
{ return __f(*this); }

basic_ostream& operator<< (_Basic_ios& (*__f)(_Basic_ios&))
{ __f(*this); return *this; }

basic_ostream& operator<< (ios_base& (*__f)(ios_base&))
{ __f(*this); return *this; }

然后有如下全局函数:
template
inline basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os) {
__os.put(__os.widen('\n'));
__os.flush();
return __os;
}

可见原来我们经常使用的cout<<.....<
// basefield manipulators, section 27.4.5.3
inline ios_base& dec(ios_base& __s)
{ __s.setf(ios_base::dec, ios_base::basefield); return __s; }

inline ios_base& hex(ios_base& __s)
{ __s.setf(ios_base::hex, ios_base::basefield); return __s; }

inline ios_base& oct(ios_base& __s)
{ __s.setf(ios_base::oct, ios_base::basefield); return __s; }

原来这些我们经常见到的C++流输出格式符居然都是一些函数,都是通过重载<<操作符来实现的。
转 http://www.cppblog.com/luke/archive/2009/04/01/78572.html

[使用Ctrl+Enter键可以直接提交]




引文来源 c++标准库中endl的实现(转) - Tinysun - BlogJava
广告赞助商