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