LINUX.ORG.RU

tuple<Args ...args>

 ,


0

2

помогите разобраться с шаблонизацией. есть класс, который занимается сериализацией данных для передачи по сети. использую msgpack (c++). заготовки методов выглядят так:

template <typename... Args >
void pack(Args... args) {
    msgpack::type::tuple < Args...> tuple(args...);
    msgpack::pack(m_sbuf, tuple);
    // кортеж в буфере
}
template <typename... Args >
msgpack::type::tuple < Args...> unpack(Args ...args){
   msgpack::unpacked msg = msgpack::unpack(m_sbuf.data(), m_sbuf.size());
   msgpack::type::tuple < Args...> tuple(args...);
   msg.get().convert(tuple);
   return tuple;
   // вынули кортеж из буфера.
}

использование

// тут все ок
pack( true, 12, std::string("hello"));
//а тут как-то сомнительно
int i; bool b; std::string s;
msgpack::type::tuple < bool, int, std::string> tuple = unpack(b, i, s);
сомнительно, а именно формально нужно передать параметры в unpack, чтобы работало в приведенном варианте. можно ли сделать что-то типа
unpack<Args...>
, ну т.е. без формальной передачи параметров.

★★★

Последнее исправление: conalex (всего исправлений: 1)

Можно.

Тыж всегда знаешь тип, который идет первый. Дальше шаблонная магия. ну и формат знает свои типы, вроде как.

Кстати как он со вложенными мессаджами в этом случае работает?

anonymous
()
Ответ на: комментарий от anonymous

олсо cast eao197

Никогда не имел дела с msgpack, но, имхо, имеет смысл тупо попробовать вот так:

template <typename... Args >
msgpack::type::tuple < Args...> unpack(){
   msgpack::unpacked msg = msgpack::unpack(m_sbuf.data(), m_sbuf.size());
   msgpack::type::tuple < Args...> tuple;
   msg.get().convert(tuple);
   return tuple;
}
...
auto t = unpack<bool, int, std::string>();

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.