STL: манипуляторы потоков
От: orangy Россия
Дата: 13.09.02 09:44
Оценка:
Для затравки начнём с потоков.

Согласно стандарту, operator<< для функций-манипуляторов выглядит так:
basic_ostream<charT,traits>& operator<<
   (basic_ostream<charT,traits>& (* pf)(basic_ostream<charT,traits>&));

Returns: pf(*this).

Что, вобщем не мешает возвращать другой поток из манипулятора.
Таким образом код
  ostream& mutatestream(ostream& s); // возвращает не s, а другой поток
  cout << "some string" << mutatestream << "another string";

потенциально может вывести "another string" в другой поток.

Вопрос: регулирует ли стандарт такое поведение (я что-то не нашёл)? В любом случае, как по-вашему должно быть?
... << J 1.0 alpha 4 >>
"Develop with pleasure!"
Дополнение
От: orangy Россия
Дата: 13.09.02 09:47
Оценка:
Дополнение: vc.net содержит следующее определение:

inline ostream& ostream::operator<<(ostream& (__cdecl * _f)(ostream&)) { (*_f)(*this); return *this; }

Что не соответствует стандарту, но на вопрос отвечает по-своему. А как быть в общем случае?
... << J 1.0 alpha 4 >>
"Develop with pleasure!"
Re: STL: манипуляторы потоков
От: m.a.g. Мальта http://dottedmag.net/
Дата: 13.09.02 09:50
Оценка:
Здравствуйте orangy, Вы писали:

O>Для затравки начнём с потоков.


O>Согласно стандарту, operator<< для функций-манипуляторов выглядит так:

O>
O>basic_ostream<charT,traits>& operator<<
O>   (basic_ostream<charT,traits>& (* pf)(basic_ostream<charT,traits>&));

O>Returns: pf(*this).
O>

O>Что, вобщем не мешает возвращать другой поток из манипулятора.

Хм. Да, вообще-то, этого можно любой перегрузкой operator<< добиться. ИМХО это просто соглашение. Хотя было бы интересно узнать, есть ли в каком-нибудь нормативном документе необходимость согласования входного и выходного параметров?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.