Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/01/2013, 08:13
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: ¿cómo definir un manipulador de flujo parametrizado?

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
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <iterator>
  4. using namespace std;
  5.  
  6. struct smanip{
  7.     ostream& (*f)(ostream&, int);
  8.     int i;
  9.     smanip(ostream& (*ff)(ostream&, int), int ii):f(ff), i(ii){}
  10. };
  11.  
  12. ostream& operator<<(ostream& os, const smanip &m){
  13.     return m.f(os, m.i);
  14. }
  15.  
  16. ostream& fines_linea(ostream& os, int n){
  17.     ostream_iterator<char> it(os);
  18.     fill_n(it, n, '\n');
  19.     return os;
  20. }
  21.  
  22. inline smanip finesdelinea(int n){
  23.     return smanip(fines_linea, n);
  24. }
  25.  
  26. int main(){
  27.     cout << "Hola" << finesdelinea(10) << "Adios";
  28.     return 0;
  29. }

Saludos.