Я хотел бы эффективно копировать данные между экземплярами std::streambuf
. То есть, я хотел бы сгребать блоки данных между ними, а не выполнять копирование по одному символу. Например, это не то, что я ищу:
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Для этого существует синтаксический сахар, с еще большей проверкой ошибок:
ostream os{&out};
os << ∈
Вот фрагмент реализации operator<<(basic_streambuf<..>*)
в моей стандартной библиотеке (Mac OS X, XCode 7):
typedef istreambuf_iterator<_CharT, _Traits> _Ip;
typedef ostreambuf_iterator<_CharT, _Traits> _Op;
_Ip __i(__sb);
_Ip __eof;
_Op __o(*this);
size_t __c = 0;
for (; __i != __eof; ++__i, ++__o, ++__c)
{
*__o = *__i;
if (__o.failed())
break;
}
Суть в том, что это копирование по-одному. Я надеялся, что стандартная библиотека использует алгоритм, который опирается на функции-члены уровня блока streambuffers, sputn
и sgetn
, в отличие от транспорта на один символ. Предоставляет ли эталонная библиотека такой алгоритм или мне нужно сворачивать самостоятельно?