Как я должен кодировать вещи? - PullRequest
2 голосов
/ 09 января 2012

Я генерирую код для кодирования различных структур C ++ в JSON, используя JSON spirit .

Сгенерированный код в настоящее время выглядит примерно так:

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));
}

Основная идея: Для кодирования того, что вы называете шаблоном, который разыменовывает его, затем передает его сгенерированным функциям. Они, в свою очередь, вызывают шаблоны разыменования для кодирования любого из своих полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...