[cppll:0598] <tips>ストリームを拡張する

Subject:
[cppll:0598] <tips>ストリームを拡張する
From:
SHINOHARA Shoji <s-shinohara@...>
Date:
Mon, 21 Jan 2002 18:55:18 +0900 (JST)
X-Mailer:
Becky! ver. 2.00.08
Message-Id:
<20020121180121.C11B.S-SHINOHARA‐at‐daiichi-c.co.jp>
iostreamの拡張(http://www.jah.ne.jp/%7enaoyuki/Writings/ExtIos.html)
というページを見て,よく分かってもいないのに
「今だったら basic_stringbuf 使ってもっと短く書けるのでは?」
などと考えて書いた物です。
CppUnit 1.5.x の頃に VC++ の IDE 内でタグジャンプしたかったので,
デバッグ出力になってます。機種依存しすぎかな。

#include <ostream>
#include <sstream>
#include <windows.h>    // OutputDebugString()

/* VC++ で STLport だと using std::char_traits; みたいなのが
* 必要かも
*/
template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
class basic_dbgout_streambuf: public std::basic_stringbuf<Ch_T, Tr_T>
{
public:
 basic_dbgout_streambuf()
 {
   // openlog()とか ::AllocConsole()とか ::RegisterEventSource()とか
 }

 virtual ~basic_dbgout_streambuf() {
   sync();
   // closelog()とか ::FreeConsole()とか ::DeregisterEventSource()とか
 }

protected:
 int sync(void) {
   // syslog()とか ::WriteConsole()とか ::ReportEvent()とか
   dbg_out(str().c_str());
   pbump(pbase() - pptr());
   return 0;
 }

 void dbg_out(const Ch_T*);
};

template <>
void basic_dbgout_streambuf<char>::dbg_out(const char *str)
{
 ::OutputDebugStringA(str);
}

template <>
void basic_dbgout_streambuf<wchar_t>::dbg_out(const wchar_t *str)
{
 ::OutputDebugStringW(str);
}

template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
class basic_dbgout_ostream: public std::basic_ostream<Ch_T, Tr_T>
{
public:
 basic_dbgout_ostream()
   : std::basic_ostream<Ch_T, Tr_T>(new basic_dbgout_streambuf<Ch_T, Tr_T>())
 {
 }

 virtual ~basic_dbgout_ostream()
 {
   flush();
   delete rdbuf();
 }
};

typedef basic_dbgout_streambuf<char>  win32debugout_streambuf;
typedef basic_dbgout_ostream<char>  win32debugout_stream;

こんな感じで使います。
int main(int argc, char **argv)
{
 win32debugout_stream dbg;
 dbg << "びよ〜ん" << std::endl;
}
Windows 上の IDE 環境や dbgmon みたいなのでしか嬉しくないネタで済
みません。

syslog やイベントログのファシリティ指定などはマニピュレータを作る
んだと思いますが,それはこれから勉強しないと...

-----
// 篠原 昌二 (s-shinohara@...)

スレッド

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here