C++ の「ゼロつめ」
自前の boost::format 風のクラスのバグを発見しました。プロジェクトが随分進んでいるのに今更こんなの良く出てきたなぁと思ったのですが、そのクラスを使用しているコードを眺めると、正負で処理を分けてる回避コードがちらほら目に付きます。むー、、、、なんといいいますか、「見つけたら直しとけ!」・・・と言いたい気分をグッと堪えた木曜の午後。(時効なのをグダグダ言っても、プロジェクトに良い効果はないのよね)
そのバグというのは format("%06d") % -42 ・・みたいなのにあって、
#include <iostream> #include <iomanip> using namespace std; int main( void ) { cout << setfill('0') << setw(6) << -42; return 0; }
の出力が、"000-42" になるのに起因するもの。「ゼロ詰め」を「'0' という文字を詰める」 + 「数→数字変換」と書いてしまえば、当たり前の挙動 なのだけれど、それでも C++ のストリームって 使いにくくバグを誘発するダメ仕様なんじゃないかと思ってしまう。なんというか、真面目すぎて使い勝手が悪くなっちゃう、C++の「コッチコチ」な面を良く象徴しているなぁ、と ちょっと思いました。
そうなると boostって、他の言語ユーザからすると、当たり前のものが当たり前になっただけジャン・・というものが、メタプログラミングによって実現されるという驚異の展開が 人を惹きつけてやまないのかも、とか思ったり。