basic_ios::rdbuf()
basic_istream や basic_ostream の親である basic_ios は title に書いた関数を持っているらしくこいつは何をするものかというと basic_ios object が保持している basic_streambuf object の getter / setter らしい。てことは前いってた標準入出力に関連づけられている basic_streambuf object ( http://d.hatena.ne.jp/janus_wel/20100216/1266347871 ) も std::cin.rdbuf()
や std::cout.rdbuf()
で取得できるんじゃね ? てことで以下のような code を書いてみた。
#include <io.h> #include <ios> #include <fstream> #include <iostream> template<typename Ch, typename Tr = std::char_traits<Ch> > class basic_iofilter : public std::basic_iostream<Ch, Tr> { public: basic_iofilter(std::basic_streambuf<Ch, Tr>* bs) : std::basic_iostream<Ch, Tr>(bs) {}; ~basic_iofilter(void) {}; }; const char filename[] = "switchbuf.txt"; int main(void) { if (_isatty(_fileno(stdout))) { std::basic_filebuf<char> fb; fb.open(filename, std::ios::out | std::ios::trunc); basic_iofilter<char> os(&fb); os << "this is the test about switching streambuf." << std::endl; } else { basic_iofilter<char> os(std::cout.rdbuf()); os << "this is the test about switching streambuf." << std::endl; } return 0; }
一応動いた ( VC++ 2008 Express Edition と MinGW gcc 4.4.0 で確認 ) 。いやでもこれ意味がないような…。 basic_iostream を派生させて独自の formatting rule を追加する、というのはズレてるのかな。 source 覗いても basic_iostream は前方宣言されてるだけで実際の宣言がないから何を override するべきかわからんし web 上にもこういうことをしているひとはいないみたいだし。 manipulator で何とかする方向なの ?