проблема наследования ostream и streambuf с xsputn и overflow

Я проводил исследования по созданию моего собственного ostream и, вместе с тем, streambuf для обработки буфера для моего ostream. На самом деле у меня большая часть этого работает, я могу вставить (<<) в свой поток и без проблем получить строки. Я делаю это, внедряя виртуальную функцию xsputn. Однако, если я ввожу (<<) в поток вместо строки значение с плавающей запятой или int, xsputn никогда не вызывается.

Я просмотрел код и увидел, что поток вызывает do_put, затем f_put, который в конечном итоге пытается поместить в буфер один символ с плавающей запятой за раз. Я могу заставить его вызвать мою реализацию переполнения виртуальной функции (int c), если я оставлю свой буфер без места и тем самым получу данные для float и int.

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

Я, по общему признанию, злоупотребляю дизайном ostream, поскольку мне нужно кэшировать вывод, а затем отправлять его все сразу для каждого введенного значения (<<).

В любом случае, чтобы внести ясность, я повторю то, для чего я стреляю, по-другому. Скорее всего, я просто ошибаюсь.

Я хочу использовать унаследованные ostream и streambuf, чтобы я мог вводить в них значения и позволять ему обрабатывать преобразование моего типа за меня, тогда я хочу передать эту информацию другому объекту, которому я передаю дескриптор в streambuf (для?). Этот объект имеет дорогостоящий ввод-вывод, поэтому я не хочу отправлять данные по одному символу за раз.

Заранее извините, если это неясно. И спасибо за ваше время.

6
задан Digital Powers 12 April 2011 в 21:52
поделиться