さいきんC++始めました。

まだ始めて2、3日なのですがCにクラスとか色々マクロで拡張を施した言語という印象です。

元々の出発点が「C with Classes」というCの拡張なのだからだと思います。

で、まず標準出入力やファイル出入力のやりかたとか触った後に試したのがJSONのパーサー。
json
ググって見たらpicojsonなるものを発見!これなんとヘッダファイルだけで実装されています。そういうの好き。

こんな感じで使います。

picojson::value json;
cin >> json;

picojson::object& o = json.get<picojson::object>();
int hoge = o["hoge"].get<double>();
bool fuga = o["fuga"].get<bool>();
string piyo = o["piyo"].get<string>();
picojson::array hogehoge = o["hogehoge"].get<picojson::array>();
楽過ぎ!

o["fuga"] = (picojson::value)string("hogehoge");
o.insert(map<string, double>::value_type("piyopiyo", 10.0));
cout << json;
値の変更と出力は以上!
プログラマにこんな楽させちゃダメですよ。 嘘。

ただ、VC2003だとビルド時にエラーが出るので、こうしました。
#ifdef _MSC_VER
#undef getc /* FIXME:VC2003 */
#define SNPRINTF _snprintf /* FIXME:VC2003 */
#pragma warning(push)
#pragma warning(disable : 4244) // conversion from int to char
#else
#define SNPRINTF snprintf
#endif
ヘッダの上の方の部分ですが、VC2003だとなんか色々問題があった模様。

あと356行目は
    bool expect(int expect) {
skip_ws();
if (getc() != expect) {
ungetc();
return false;
}
return true;
}
返却する型はintじゃなくてboolかな…。

そして609行目
  inline bool operator==(const value& x, const value& y) {
if (x.is<null>())
return y.is<null>();
#define PICOJSON_CMP(type) \
複数ファイルで使おうとするとリンクエラーになるのは、ここにinlineが抜けてたからかな…。

まだC++の理解度が0.5%程度なので間違いも多々ありますが…ビルド時に警告は出ないのでこれでいいのではないかと。

こうやって外部の設定ファイルが読めるようになったらもうコッチのもんですよw
1/60のループはglutでサクッとできてるし、あとはアプリの実装を書くだけになりました。


こんな素敵なJSONパーサーを書いてくれたkazuhoさん、どうもありがとうございます!多謝。

ではまた次回。