Un stream es un canal de flujo de datos; en C++ existen flujos de lectura (entrada), escritura (salida), lectura y escritura (entrada y salida), en modo binario o texto, y la combinación de ellos (lectura-binario, escritura-texto).

Hay dos operadores principales encargados de ser el canal de flujo de datos: el primero es el de inserción <<, y el segundo el de extracción >>. El operador de inserción << se encarga de insertar datos en un flujo de salida std::ostream, como lo es std::cout.

Sobrecarga

Para una estructura personalizada es necesario sobrecargar este operador con el fin de enviar el flujo a un archivo, a un log, al stdout, a una variable, o a derivados de flujos; en general a objetos stream.

Dentro de la estructura se sobrecarga como una función no-miembro, y friend para poder acceder a sus miembros protegidos y privados. Retorna una referencia a std::ostream ya que se inserta a un flujo de salida, y tiene como parámetros el objeto de flujo y el objeto de la estructura, el cual debe ser una referencia constante:

#include <iostream>

struct Persona
{
  unsigned    edad;
  std::string nombre;

  friend std::ostream& operator<<(
          std::ostream& os, 
          const Persona& p)
  {
    os << p.nombre << " tiene " << p.edad << " años.";
    return os;
  }
};

int main()
{
  Persona persona{20, "Juan"};
  
  std::cout << persona << "\n";

  return 0;
}

Produce la salida

Juan tiene 20 años.

Extracción

De manera similar se puede sobrecargar el operador de extracción pero con un flujo de lectura std::istream, y así extraer el flujo por ejemplo desde std::cin.

Comentarios

Está pendiente de validación, y por ahora está como una consideración personal de una lectura de la cual no recuerdo exactamente la fuente, sin embargo recuerdo que sería posible considerar esta sobrecarga del operador de inserción, friend y no-miembro, como una implementación del patrón intrusive visitor.

Fuentes

Etiquetas:

Categorías:

Actualizado en:

Deja un comentario