Моя проблема такова: Мартин Йорк утверждает этот, this, а this отвечает, что можно сделать stringstream
чтение из некоторой части памяти с помощью basic_stringbuf::pubsetbuf
следующим образом:
char buffer[] = "123";
istringstream in;
in.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); // calls basic_stringbuf::setbuf
int num;
in >> num; // reads 123
К сожалению, я прорыл весь стандарт и не мог видеть, где он гарантированно работает. То, что я вижу, это просто определение реализации. Фактически, при реализации Microsoft (возможно, и на других) этот вызов не имеет эффекта.
Вот ссылки, которые я нашел в последнем проекте С++ 0x. Для basic_streambuf::setbuf
[streambuf.virt.buffer]:
1 Эффекты: влияет на буферизацию потока таким образом, который определен отдельно для каждого класса, производного от basic_streambuf в этом разделе (27.8.1.4, 27.9.1.5).
2 Поведение по умолчанию: Делает ничего. Возвращает это.
Однако в производных классах он, как представляется, оставляет определение реализации. Для basic_stringbuf::setbuf
он говорит [stringbuf.virtuals]:
1 Эффекты: реализация, за исключением того, что setbuf (0,0) не имеет эффекта.
Для basic_filebuf::setbuf
он говорит [filebuf.virtuals]:
12 Эффекты: если setbuf (0,0) [...], поток становится небуферизованным. В противном случае результаты реализованы. "Небуферизованный" [...]
И что это. Как я вижу, допустимая реализация может полностью игнорировать эти вызовы (для ненулевых параметров).
Неужели я ошибаюсь? Какова правильная интерпретация стандарта? У С++ 98/03/0x есть те же гарантии? У вас есть больше статистических данных о том, какие реализации работает над этим кодом, а на каких нет? Как использовать basic_streambuf::setbuf
?