Как я должен кодировать вещи?
Я генерирую код для кодирования различных структур C++ в JSON, используя дух JSON.
Сгенерированный код в настоящее время выглядит примерно так:
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));
}
Основная идея заключается в следующем: для кодирования чего-то, что вы называете шаблоном, который разыменовывает его, а затем передает его сгенерированным функциям. Они в свою очередь вызывают шаблоны разыменования для кодирования любого из своих полей.