Я делаю преобразования изображений в памяти между двумя фреймворками (OpenSceneGraph и wxWidgets). Не желая заботиться о базовых классах (osg::Image
и wxImage
), я использую функции ориентированного на поток ввода / вывода, которые оба API предоставляют следующим образом:
1) Создать std::stringstream
2) Записать в поток с использованием средств записи OSG
3) Чтение из потока с помощью считывателей wxWigdets
Это работает довольно хорошо. До сих пор я использовал прямой доступ к потоковому буферу, но недавно мое внимание привлекла проблема «несмежного базового буфера» std::stringstream
. Я использовал kludge для получения const char*
ptr в буфер - но он работал (проверено на Windows, Linux и OSX, с использованием MSVC 9 и GCC 4.x), поэтому я никогда не исправлял его.
Теперь я понимаю, что этот код - бомба замедленного действия, и я хочу от нее избавиться. Эта проблема поднималась несколько раз на SO ( здесь, например, ), но я не смог найти ответ, который действительно мог бы помочь мне сделать простейшую вещь, которая могла бы сработать.
Я думаю, что наиболее разумным является создание собственного потокового буфера с использованием вектора за кулисами - это гарантирует непрерывность буфера. Я знаю, что это не общее решение, но учитывая мои ограничения:
1) требуемый размер не бесконечен и на самом деле вполне предсказуем
2) мой поток действительно должен быть std::iostream
(я не могу использовать массив необработанных символов) из-за API
кто-нибудь знает, как я могу использовать пользовательский строковый буфер, используя вектор символов? Пожалуйста, не отвечайте «использовать std::stringstream::str()
», так как я знаю, мы можем, но я точно ищу что-то другое (даже если бы вы сказали, что копирование 2-3 МБ происходит так быстро, что я даже не заметит разницы, давайте рассмотрим, что я все еще интересуюсь пользовательскими строковыми буферами только для красоты упражнения).