Sobrecargando el operador "<<" para poder invocar un puntero a función almacenado en un objeto.
En éste ejemplo la función "fines_linea" es la encargada de insertar los saltos de línea en el flujo, para ello un puntero a dicha función es almacenado en un objeto "smanip", el cual es utilizado a través de sobrecargar el operador "<<". La función "finesdelinea" únicamente se encarga de construir dicho objeto "smanip".
Observa que la clase "smanip" y la sobrecarga del operador "<<" te sirven de manera genérica para seguir definiendo más manipuladores con un solo parámetro.
Código C++:
Ver original#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
struct smanip{
ostream& (*f)(ostream&, int);
int i;
smanip(ostream& (*ff)(ostream&, int), int ii):f(ff), i(ii){}
};
ostream& operator<<(ostream& os, const smanip &m){
return m.f(os, m.i);
}
ostream& fines_linea(ostream& os, int n){
ostream_iterator<char> it(os);
fill_n(it, n, '\n');
return os;
}
inline smanip finesdelinea(int n){
return smanip(fines_linea, n);
}
int main(){
cout << "Hola" << finesdelinea(10) << "Adios";
return 0;
}
Saludos.