直接上源码:dbgout.h

代码:
/********************************
*  DBGOUT (ver 1.3)  by triones  2010-03-26.
*
*  indentation:1 Tab == 2 Blank
*
*  !!!注意!!!在主文件包含前,请声明  #define  _DBGOUT,以定义全局变量errs
*  其它只需要包含头文件即可
*
*  DEMO:
*  errs<<"debugview中输出一个int值"<<12345678<<endd;
*  errs<<"debugview中输出一个十六进制值"<<hex<<0x12345678<<endd;
*  errs<<errTchar(TEXT("输出Unicode字符"))<<endd;
*
*  同样,你可以把errTchar应用于cout(因为只有wcout能输出Unicode)
*  cout<<errTchar(TEXT("输出Unicode字符"))<<endl;
*
*  但你不能把endd应用在cout,cerr等中,否则将出错
*
*  当然使用全局errs,在多线程下产生冲突。没有关系,你可以在需要时定义一个局部ostringstream用于输出。
*
*  2010-05-11  去除errTchar的容量限制,动态申请空间(ver 1.2)
*  2010-06-08  发现errTchar对Unicode的自行计算会让编译器做出奇怪结果(EB FE死循环),故调用标准库。(ver 1.3)
********************************/
#pragma once

#include <windows.h>
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;

#ifdef _DBGOUT
  ostringstream  errs;
#else
  extern ostringstream errs;
#endif
/********************************
*  用于确定在DebugView输出信息
********************************/
template<class _Elem,class _Traits> inline  basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endd(basic_ostream<_Elem, _Traits>& _Ostr)
  {
  ostringstream& oo = (ostringstream&)_Ostr;
  OutputDebugStringA(oo.str().c_str());    //注意到OutputDebugStringW将最终调用OutputDebugStringA,反而效率低下
  oo.clear();
  oo.str("");
  return (_Ostr);
  }
/********************************
*  用于转换Unicode为ASCII
********************************/
class errTchar
  {
  public:
    explicit  errTchar(wchar_t* lpstr):lpstr_(lpstr){}
  private:
    wchar_t* lpstr_;
    template<class _Elem,class _Traits>
    friend    basic_ostream<_Elem, _Traits>& operator<<(basic_ostream<_Elem, _Traits>& _Ostr,const errTchar& m)
      {
      int len = wcslen(m.lpstr_);
      ++len;
      len*=sizeof(wchar_t);
      char* buf = new char[len];
      WideCharToMultiByte(CP_ACP,0,m.lpstr_,-1,buf,len,0,0);
      _Ostr<<buf;
      delete[] buf;
      return (_Ostr);
      }
  };
用了很久了,也没发现网上有类似的利用。放出来分享一下。
这招是从《标准C++ 输入输出流及本地化》这书中学的,书是好书,可惜买不到了。只能看电子版。
用过流处理,知道好处的兄弟们应该不用我多说什么了吧。