Я наконец-то нашел ответ здесь: http://my.safaribooksonline.com/book/programming/cplusplus/0596007612/streams-and-files/cplusplusckbk-chp-10-sect-3.
Вот пример того, как это можно сделать:
Для начала нам нужно определить временный класс. Временная структура должна выглядеть примерно так:
class WidthSetter {
public:
WidthSetter (int n) : width_(n) {}
void operator( )(ostream& os) const {os.width(width_);}
private:
int width_;
};
Смысл этого поведения в том, что WidthSetter будет создан одной функцией и использован другой. Функция манипулятора это то, что его построит, и она должна выглядеть так:
WidthSetter setWidth(int n) {
return(WidthSetter(n)); // Return the initialized object
}
Все, что это делает, возвращает объект WidthSetter, который был инициализирован целочисленным значением. Это тот манипулятор, который мы будем использовать в соответствии с оператором <
myostream << setWidth(20) << "banana";
Но одного этого недостаточно, потому что если setWidth просто возвращает объект WidthSetter, оператор << не будет знать, что с ним делать. Мы должны перегрузить оператор <<, чтобы он знал, как обрабатывать WidthSetter: </p>
ostream& operator<<(ostream& os, const WidthSetter& ws) {
ws(os); // Pass the stream to the ws object
return(os); // to do the real work
}