続 std::basic_ostringstream
id:fifth_moon:20061106:1162823847 に id:nevil さんからコメントいただいたので追試してみました。
まず簡単なソースをでっちあげて gdb にかけてみます。
typedef unsigned short unishort; typedef std::basic_stringunistring; typedef std::basic_ostringstream ounistringstream; ounistringstream ounistrm; ounistrm << unishort(0x4230); std::cout << ounistrm.str().size() << std::endl;
すると、std::basic_ostream
ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) { return ostrm; }
とすると std::ios_base::failbit が立ちません。そうゆうことか。
ounistringstream& operator<<(ounistringstream& ostrm, const unishort us) { ostrm.str(ostrm.str() += us); return ostrm; }
これで期待通りに動くようになりました。
std::ostream_iterator
GCC の stdc++ の ostream_iterator には value_type が定義されてない*1。継承元の iterator には void が渡っているので value_type を参照すると void になる。なので
templatevoid func(Iter iter) { std::iterator_traits ::value_type hoge; ... }
なコードに GCC の ostream_iterator を渡すとコンパイルエラーになる。
Microsoft Platform SDK for Windows Server 2003 R2 には value_type が定義されている*2。
規格でどうなってるかは調べてない。
spam block
いいかげん Hiki の掲示板プラグイン(bbs)へのスパムが鬱陶しいので対策。本文に http:// が入っていたら弾くという単純仕様。これでしばらく様子を見ることにする。
--- misc/plugin/bbs.rb.orig Thu Sep 14 14:11:02 2006 +++ misc/plugin/bbs.rb Thu Sep 14 15:33:44 2006 @@ -37,6 +37,7 @@ msg = params['msg'][0] return '' if msg.strip.size == 0 + return '' if msg.strip.include?('http://') lines = @db.load( @page ) md5hex = @db.md5hex( @page )