строка — почему msgpack-c ++ не поддерживает вектор & lt; float & gt; или вектор & lt; double & gt; в моем случае?

Смотрите мой код ниже: (вы можете скомпилировать код с помощью: g ++ — 4.7 demo.cpp -std = c ++ 11 -lmsgpack)

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <msgpack.hpp>
using namespace std;

template<class T>
void pack(T &t, string &str)
{
using namespace msgpack;
sbuffer buff;
pack(buff, t);
ostringstream is;
is << buff.size() << buff.data();
str = string(is.str());
}

template<class T>
T unpack(string &str)
{
using namespace msgpack;
unpacked result;
istringstream ss(str);
int len;
string buff;
ss >> len >> buff;
unpack(&result, buff.c_str(), len);

auto obj = result.get();
return obj.as<T>();
}

int main(int argc, char *argv[]) {
vector<float> t = {1., 2., 3., 4., 5.};
string s;
pack(t, s);
auto r = unpack<vector<float> >(s);
for(auto & v : r)
std::cout << v << std::endl;
// vector<int> is right
/*
vector<int> t = {1, 2, 3, 4, 5};
string s;
pack(t, s);
auto r = unpack<vector<int> >(s);
for(auto & v : r)
std::cout << v << std::endl;
*/
return 0;
}

Существует странная ошибка, заключающаяся в том, что «vector», «vector», «int», «double» могут работать в описанной выше инкапсуляции, в то время как «vector», «vector» — нет.

ошибка во время выполнения показывает ниже:

terminate called after throwing an instance of 'msgpack::type_error'
what():  std::bad_cast

но в приведенной ниже инкапсуляции может хорошо работать любой тип:

template<class T>
void pack(T &t, msgpack::sbuffer sbuf) {
pack(&sbuf, t);
}

template<class T>
T unpack(const msgpack::sbuffer & sbuf) {
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
auto obj = msg.get();
return obj.as<t>();
}

В чем проблема в моем первом коде?
Спасибо!

1

Решение

Двоичный вывод msgpack может содержать нулевые байты, как это происходит в вашем случае. is […] << buff.data(); будет выводить только первые 4 байта в вашем случае.

Чтобы исправить ошибку замените is << buff.size() << buff.data(); с is << buff.size() << string(buff.data(), buff.size());,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]