[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@...)
というページを見て,よく分かってもいないのに
「今だったら 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@...)
▼ スレッド
- 598: iostreamの拡張(http://www.jah.ne.jp/%7enaoyuki/Writings/ExtIos.html) というページを見て,よく分かってもいな SHINOHARA Shoji
- ├605: これって'ないす'かも。 CppUnit1.7.1(α)には失敗すると "ファイル名(行番号) ..." の形式で出力する FUKUDA Fumiki
- │└608: 以前,別の ML でも同じような言葉をいただいたような... CppUnit 1.5.x の時は,TextTestResult に手を入 SHINOHARA Shoji
- │ ├610: それが世の常ってもんで^^; まったく。特に assert マクロがコロコロ変わったのには閉口しまし FUKUDA Fumiki
- │ │└612: Shin'ya MORINO
- │ │ └750: ほんまほんま。'総素源'まで仲間入りしてしもたしなぁ... FUKUDA (episteme) Fumiki -- magical, but never a m FUKUDA Fumiki
- │ └873: namespace CppUnit { class WinDebugTestResult : public TextTestResult { public: virtual void printErrors (std::ostream& stream); FUKUDA Fumiki
- │ └1037: 真似して、Emacs版。 EmacsTestResult.hpp----------------------------------- class EmacsTestResult: public CppUnit::TextTes Shin'ya MORINO
- └607: 自分もこのページを参考にソケット用ストリームを作ったんですけど、 send、recvでやってた頃 Takeshi Mouri
- └609: 私は,シリアル通信で似たようなことをやろうとして挫折しました。 期待してます。 あらら,確 SHINOHARA Shoji