2007年4月19日

Logger中操纵器的实现

代码下载
我突然想起 std::endl 这样一个东西,很想看看究竟它是怎么实现的.就像jjhou先生在<<stl 源码剖析>>中说的"under the hood".
endl的实现(Visual Studio 7.1版本):
代码下载
我突然想起 std::endl 这样一个东西,很想看看究竟它是怎么实现的.就像jjhou先生在<<stl 源码剖析>>中说的"under the hood".
endl的实现(Visual Studio 7.1版本):

_CRTIMP2 inline basic_ostream<char, char_traits<char> >&
__cdecl endl(basic_ostream<char, char_traits<char> >& _Ostr)
{ // insert newline and flush byte stream
_Ostr.put('\n');
_Ostr.flush();
return (_Ostr);
}
流的这一端:
    _Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&amp;))
{ // call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
基本原理就是:
1.模板特化了operator<<的一个版本.
2.使用了访问者模式,最终endl调用的还是_Oster的成员函数.
应用到Logger上:
class Logger
{
public:
typedef Logger& (*pfn)(Logger& );

Logger& operator<<(pfn mani)
{
mani(*this);
return *this;
}
......
};

Logger el(Logger& stream)
{
stream << '\n';
return stream;
}
测试一下:
P.S.把模板代码贴成html真是麻烦<要换成&lt;,>要换成&gt;,连&自己也要换成&amp;有没有简单点的办法...
测试一下:
Logger a;
a << 1 << el << std::string("(temp comment)") << el;
a << 1.001 << el << 't' << el;
a.Print();
system("PAUSE");

2 条评论:

Unknown 说...

Logger el(Logger& stream){ stream << '\n'; return stream;}

应该返回一个Logger引用,写错了?

yaker 说...

你说对了(这都被你发现了,太强...)
我第一次发表完了之后看到了,想改的,但是不是很好改,一改blogspot的代码就乱了。
我现在有办法了,用word 2007写,还可以管理账户,只是不提供ssl