альтернативы std :: string для использования с boost :: asio

boost :: asio различные read и функции и методы записи принимают boost :: asio :: buffer . Согласно документации буфера , изменяемый std :: Строка не может быть заключена в boost :: asio :: buffer и, следовательно, не может использоваться для функций asio read . Вероятно, это связано с тем, что std :: string не разрешает изменяемый доступ к своему внутреннему буферу (это обсуждалось ранее здесь ).

Это позор, потому что std :: string - удобный способ представления изменяемых буферов данных в C ++. Без него мы либо останемся с массивами POD, boost :: array и std :: vector . Первые два неудобны для сообщений переменной длины. std :: vector может работать, но это неестественный способ переноса буферов данных вокруг (*)

Вопросы:

  1. Существуют ли другие альтернативы std :: строка с boost :: asio для чтения буферов? Я что-то упустил?
  2. Интересно, почему std :: vector поддерживается в изменяемом буфере. Это потому, что он гарантирует, что его внутренний буфер непрерывен в памяти и разрешает изменяемый доступ к нему с помощью & vec [0] ?

Заранее спасибо


(*) ИМХО. Посмотрите, например, на сериализацию protobuf - она ​​предлагает сериализацию в std :: string , но не в std :: vector , по крайней мере, не явно.


РЕДАКТИРОВАТЬ: Я все-таки использовал vector . protobuf разрешает сериализацию в вектор с помощью вызова SerializeToArray , который принимает указатель (туда можно передать & vec [0] ).

19
задан Community 23 May 2017 в 12:10
поделиться