C++流文字列数値変換

熟練のC++プログラマでもあまり使われない構文としてマニピュレータというのがあります。私も数えるほどしか使ったことがありません。確か、数値計算でdouble型を有効桁数fullでファイルに書き出したかったときに使ったような・・・。あとは16進数出力とか。
もう一つ、C++のレア構文としてstringstreamというのがあります。これはC言語で言うところのsprintfに相当します。こいつに関しては存在は知っていたけど使ったことはありません。そもそもstringstreamで出来ることぐらいなら普通に書けたし。そういうわけで見向きもしませんでした。

しかしこの2つの構文、実は組み合わせるとメチャ強力だということを最近知りました。stringstreamが文字列⇔数値が出来て、さらに変換方法としてマニピュレータを挟めば殆どの変換が簡単に実現できてしまいます。
例としてd:id:n-trino:20050602#p1を書いてみると

#include <string>
#include <sstream>
#include <iomanip>

std::string NumToString( int num, int size )
{
	std::ostringstream sout;
	sout << std::setw(size) << std::internal << std::setfill( '0' ) << num << endl;
	return sout.str();
}

となります。内容的に関数にするまでもないですね。しかも今回は負の値まで使えます。頑張って関数作ってたのがアホみたいですorz
逆も簡単です。つまり、数字→数値ですね。これは普通にcinの感覚でOKですね。

double pi, h;
char c1, c2, c3, c4;
int i;
std::istringstream sin( "6.626068e-34 / ( 3.14159 * 2 )" );
sin >> h >> c1 >> c2 >> pi >> c3 >> i >> c4;

マニピュレータを使ってないですが(^^; 多分16進数で表した文字列を読み込んだりするときは必要です。



まあ、欠点としてはマニピュレータの種類を覚えるのが面倒ですが(ぉ