2009年2月7日土曜日

boostで文字列と数字を連結する方法2件

Javaだと文字列と数字の連結は簡単で,
"string" + 1
で"string1"になってくれる.C++の文字列にも+演算子が定義されているのだが,残念ながら文字列との結合しかしてくれないようだ.で,こういう場合どうするかというとstring streamを使うのが定番らしい.
#include <sstream>
using namespace std;

ostringstream oss;
oss << str << 1;
string s0 = oss.str();
streamに一度書き込んで,そこから文字列を取り出すということ.うざい.

lexcal_cast

boostを使うともう少しきれいに書ける.一つは,数字を文字列に変換しておいて,文字列連結演算子で連結する方法.
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;

string s1 = s  + lexical_cast<string>(1);
cout << s1 << endl;
だいぶきれいだが,キャストにかかる文字列が長くてこれはこれでうざい.ちなみに実装としてはstring stream を使っているらしい.

format

formatをつかってもいい.これはCのprintf的なフォーマットを実現するもの.関係ないが,ヘッダファイルだけで実現されている.どうやってフォーマットをパーズしているんだろうなあ..
#include <boost/format.hpp>
using namespace std;
using namespace boost;

string s2 = (format("%1%%2%") % str % 1).str();
cout << s2 << endl;
%演算子で区切って引数を渡す構造.面倒なことに%演算子の優先順位が<<などより弱いので,括弧でくくらないとへんなことになったり.

どれで書いてもあんまりすっきりしないなあ.なんで文字列に他の型を結合できるように演算子が定義されていないんだろう?

0 件のコメント: