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 意見 :
張貼留言