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
- CppReference: Biblioteca de entrada/salida
- Geeks for geeks: Overloading stream operators
Deja un comentario