Тут с переходом на свежий 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;
c++, pqxx