JSON Spiritを使用して、JSON でさまざまな C++ 構造体をエンコードするコードを生成しています。
生成されたコードは現在、次のようになっています。
Value _encode(df::tile_page rval){
Object val;
val.push_back(Pair("token", encode(rval.token)));
val.push_back(Pair("filename", encode(rval.filename)));
val.push_back(Pair("tile_dim_x", encode(rval.tile_dim_x)));
val.push_back(Pair("tile_dim_y", encode(rval.tile_dim_y)));
val.push_back(Pair("page_dim_x", encode(rval.page_dim_x)));
val.push_back(Pair("page_dim_y", encode(rval.page_dim_y)));
val.push_back(Pair("texpos", encode_vector<int32_t>(rval.texpos)));
val.push_back(Pair("datapos", encode_vector<int32_t>(rval.datapos)));
val.push_back(Pair("texpos_gs", encode_vector<int32_t>(rval.texpos_gs)));
val.push_back(Pair("datapos_gs", encode_vector<int32_t>(rval.datapos_gs)));
val.push_back(Pair("loaded", encode(rval.loaded)));
return Value(val);
}
ただし、人々が構造体、構造体へのポインター、または参照を渡しているかどうかを判断するのは難しいと思います。私は C/C++ を初めて使用するので、いくつかの微妙な点は私にはわかりません。
構造体ごとに _encode の複数のバージョンを作成することを考えていました。(df::tile_page、df::tile_page*、df::tile_page&、df::tile_page**など)...しかし、これは不要に思えますか?
逆参照するためのテンプレートを作成したかったのですが、うまくいきませんでした。逆参照テンプレートを使用してみましたが、未定義のシンボル エラーが発生し続けました。
undefined symbol: json_spirit::Value_impl<json_spirit::Config_vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > encode<df::world>(df::world*)
現在のテンプレート:
template<typename T> T & dereference(T &v) { return v; }
template<typename T> T & dereference(T *v) { return dereference(*v); }
template <class T>
Value encode(T x) {
return _encode(dereference(x));
}
template <class T>
Value encode(T* x) {
return _encode(dereference(x));
}
主なアイデアは次のとおりです。何かをエンコードするには、テンプレートを呼び出して逆参照し、生成された関数に渡します。次に、逆参照テンプレートを呼び出して、フィールドをエンコードします。