boost::asio
различные read
и write
функции и методы принимают boost::asio::buffer
.Согласно документации буфера , изменяемый std::string
не может быть заключен в boost::asio::buffer
и, следовательно, не может использоваться для функций read
asio.Вероятно, это связано с тем, что std::string
не разрешает изменяемый доступ к своему внутреннему буферу (это обсуждалось ранее здесь ).
Это позор, потому что std::string
удобный способ представления изменяемых буферов данных в C ++.Без этого у нас либо останутся массивы POD, boost::array
и std::vector<char>
.Первые два неудобны с сообщениями переменной длины.std::vector<char>
может работать, но это неестественный способ переносить буферы данных вокруг (*)
Вопросы:
- Существуют ли другие альтернативы
std::string
с boost::asio
длябуферы чтения?Я что-то здесь упускаю? - Интересно, почему
std::vector<char>
поддерживается в изменяемом буфере.Это потому, что он гарантирует, что его внутренний буфер является непрерывным в памяти и обеспечивает изменяемый доступ к нему с &vec[0]
?
Заранее спасибо
(*) ИМХО.Посмотрите, например, сериализацию protobuf
- она предлагает сериализацию в std::string
, но не в std::vector<char>
, по крайней мере, не в явном виде.
РЕДАКТИРОВАТЬ: В итоге я использовал vector<char>
в конце концов.protobuf
позволяет сериализовать в vector<char>
с помощью вызова SerializeToArray
, который принимает указатель (&vec[0]
может быть передано туда).