1. 建立 cout wrapper class 繼承
std::basic_streambuf< char, std::char_traits< char > >
2. 在 class 的 constructor 加入(其中 m_pBuf 為暫存的 cout buffer):
m_pBuf = std::cout.rdbuf( this );
3.在 class 的 destructor 加入下列(還原原來的 cout buffer):
m_Stream.rdbuf( m_pBuf );
4. 利用此 class override 兩個 function 分別為 xsputn 及 overflow:
/**
* Override xsputn and make it forward data to the callback function.
*/
std::streamsize xsputn( const char* _Ptr, std::streamsize _Count )
{
m_pCbFunc( _Ptr, _Count ); //m_pCbFunc 為使用者定義的 callback function
return _Count;
}
/**
* Override overflow and make it forward data to the callback function.
*/
std::char_traits< char >::int_type overflow( std::char_traits< char >::int_type v )
{
char ch = std::char_traits< char >::to_char_type( v );
m_pCbFunc( &ch, 1 ); //m_pCbFunc 為使用者定義的 callback function
return std::char_traits< char >::not_eof( v );
}
5. 程式建立此 class 之後,所有的 cout 呼叫都會將字串以 callback 方式傳給使用者定義的 callback function 了!
0 意見 :
張貼留言