Для затравки начнём с потоков.
Согласно стандарту, 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 >>
Дополнение: vc.net содержит следующее определение:
inline ostream& ostream::operator<<(ostream& (__cdecl * _f)(ostream&)) { (*_f)(*this); return *this; }
Что не соответствует стандарту, но на вопрос отвечает по-своему. А как быть в общем случае?
... << J 1.0 alpha 4 >>
Здравствуйте 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<< добиться. ИМХО это просто соглашение. Хотя было бы интересно узнать, есть ли в каком-нибудь нормативном документе необходимость согласования входного и выходного параметров?