LINUX.ORG.RU

char*, string_view и ostream

 ,


0

1

Тут с переходом на свежий pqxx вылезла такая проблема.

Если раньше для новых типов в string_traits<T> они требовали реализацию метода string to_sting() и мне было достаточно банального ostringstream, то сейчас они требуют реализацию static zview to_buf (char *begin, char *end, TYPE const &value), т.е. требуется возвращать string_view для заданного буфера.

В общем вопрос простой, как можно использовать ostream для внешнего буфера, используя только библиотечные классы? При этом нельзя переполнять буфер и переалоцировать его тоже.

Пока я так понял, что придётся реализовать свoй basic_streambuf. Т.к. стандартный basic_stringbuf, во-первых, хочет string, а, во-вторых, буфер переданный в string который передадут в ostringstream может быть переаллоцирован.

UPD. Впрочем как оказалось всё достаточно элементарно и давно есть в примерах на cppreference.

template<typename _CharT, class _Traits = char_traits<_CharT>> class my_ostreambuf: public basic_streambuf<_CharT, _Traits> {
private:
protected:
    my_ostreambuf() {
    }
public:
    using _Base = basic_streambuf<_CharT, _Traits>;
    using char_type = typename _Base::char_type;

    my_ostreambuf( char_type* begin, char_type* end ) {
        _Base::setp(begin, end);
    }

    basic_string_view<_CharT, _Traits> get_view() {
        return basic_string_view<_CharT, _Traits>( _Base::pbase(), _Base::pptr() - _Base::pbase() );
    }

    virtual ~my_ostreambuf() = default;
};

typedef my_ostreambuf<char> char_ostreambuf;
★★★★★

Последнее исправление: WatchCat (всего исправлений: 1)

static zview to_buf (char *begin, char *end, TYPE const &value)

Используй как и раньше, потом доставай строку и копируй в [begin; end). string_view сделать не проблема.

как можно использовать ostream для внешнего буфера

Если поизвращаться охота, есть std::ostrstream. Ни разу этим не пользовался, не факт что оно тебе подойдёт, но там похожая идея реализована, емнип.

cloun1901
()

Пока я так понял, что придётся реализовать свoй basic_streambuf.

Если хочется продолжать пользоваться стримами и избежать лишнего копирования (скорее всего даже двух + аллокация на куче), то да, нужно реализовывать буфер. Пример реализации со статическим буфером должно быть несложно найти.

xaizek ★★★★★
()
Ответ на: комментарий от cloun1901

в чём проблема.

В том что придётся писать свой streambuf, а лень.

А to_chars вообще никак не решит проблему.

WatchCat ★★★★★
() автор топика
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от WatchCat

Да, есть такое. Но:

  • это I/O(хоть и в раму, т. е. только формально), его никто не трогает. Если всё таки будешь писать свой буфер - увидишь, как много там снизу всякого непотребства, и никто не спешит это исправлять.
  • собственно, с 98 так и не выкинули - наиболее вероятно, что это никого из комитета не интересует.
  • даже если выкинут - скорее всего в gcc его оставят, как это случилось с auto_ptr. Или просто код к себе вытяни и всё.

Проблем куда меньшие, чем с собственным streambuf-ом.

cloun1901
()
Ответ на: комментарий от PRN

мне хочется нормальных иостримовских операций, с ворматированием и прочим.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Солнце светит, вода мокрая, анонимус пердит в лужу.

WatchCat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.