basic_strstream

高木です。こんにちは。

先日、フリーウェアでも作ろうかという話をしました
とはいえ、そんな大がかりなものも作れないので、まずは簡単なものから着手することにしました。
今回はその中間報告です。

C++の標準ライブラリに、<strstream>というヘッダがあります。
このヘッダでは、strstreambuf、istrstream、ostrstream、そしてstrstreamという4つのクラスが定義されています。

このライブラリ、現在では非推奨になっていて、過去との互換性のためだけに用意されています。
以前なら、規格上は非推奨になっていても、実際にはなくなることはないだろうとタカをくくっていることができました。
ところが、最近では本当に規格から削除されてしまう破壊的変更の事例が出始めています。

さすがに、そのような状況で非推奨のライブラリに依存したコードを書くのは気が引けます。
それに、処理系によって、をインクルードするだけで非推奨の旨の警告が出て、ウザいことこの上ないのです。

<strstream>が非推奨なら、じゃあ何を使えばいいかというと、<sstream>を使えということになっています。
これは、basic_stringに対する入出力を行うもので、テンプレートなのでcharだけでなく他の文字型も使えます。
確かに使い勝手はこちらのほうが勝っています。

けれども、効率面を考えるとのクラス群に軍配が上がることも多いのです。
単純な配列に文字列を書き込みたい場合や、生の文字列をパースしたい場合なんかがまさにそうです。
sprintfやsscanfの代わりに使うということですね。

そんな状況にヒヤヒヤしながらを使い続けるのも嫌だし、諦めて使わないのもシャクです。
というわけで、標準規格があてにならないなら、自分で実装してしまおうことにしました。
そして、せっかくなので、テンプレート化することでchar以外の文字型も使えるようにしました。

以下、非常に長いですが、コードを貼っておきます。
また、最後にダウンロード用のリンクも貼っておきますので、興味がある方はどうぞ。

このライブラリを使うには、単にヘッダーファイルをインクルードするだけでOKです。

最初に書いたように、今回はあくまで中間報告です。
主だった機能はテストしましたが、細部の検証はまだできていません。
それを承知で使ってみようという方は、自己責任で自由に使っていただいてかまいません。
もし不具合を見つけられた場合は、なるべく報告していただけると助かります。

名前空間等に使っているdradnatsは、standardの逆スペルです。
今後、私がこの名前を使う機会が増えてくるかと思います。

あと、コメントがまったく入っていないのは仕様です。
標準規格にかなり詳細な記述がありますので、テンプレート化したとはいえ、下手にコメントを入れるのはうるさいだけだからです。

<dradnats/strstream>のダウンロード