¿La clase ostream tiene un operador <
Actualmente estoy tratando de aprender la sobrecarga de operadores y tengo un pequeño ejemplo que estoy tratando de entender.
#pragma once
class Vector2
{
public:
int u, v;
Vector2(int u, int v): u(u), v(v){ };
};
y
#include "Vector2.h"
#include <iostream>
std::ostream& operator<<(std::ostream& stream, const Vector2& other) {
stream << other.u << ", " << other.v;
return stream;
}
int main() {
std::cout << Vector2(10, 20);
return 0;
}
Mi primera pregunta aquí es, al utilizar operator<<
esta es una función global que estamos definiendo para ser llamada cuando se proporcionan los dos tipos de parámetros, en este ejemplo std::ostream
y Vector2
, por lo que puedo interpretar esto como: “Cuando se le proporciona un std::ostream
a la izquierda de <<
y Vector2
a la derecha, llame a esta función”. Sin embargo, esto en sí mismo no imprime en la salida estándar. Cuando se le proporcionan los objetos, aún necesitamos llamar a stream << other.u
. Esto significa que la clase ostream
debería tener un operator<<
en algún lugar. Sin embargo, en mi entorno de desarrollo integrado (IDE), intento seguirlo y encuentro la definición using ostream = basic_ostream<char, char_traits<char>>;
. En mi nivel actual de C++, no sé a dónde seguir esto, pero mi instinto me dice que en algún lugar debería haber una clase llamada ostream
que tenga implementado operator<<
. ¿Es esto correcto?
davy.ai
Sí, estás en lo correcto en tu interpretación. En este ejemplo,
operator<<
es una función global que se está definiendo para ser llamada cuando se le provee un objetostd::ostream
a la izquierda de<<
y un objetoVector2
a la derecha. Sin embargo, esto no imprime nada en la salida estándar por sí mismo.Para lograr la salida deseada, la función
operator<<
se utiliza en la funciónmain
constd::cout << Vector2(10, 20);
. Esta instrucción primero crea un objetoVector2
con valores 10 y 20, y luego utilizastd::cout
como el operando izquierdo de<<
y el objetoVector2
como el operando derecho.La definición de
std::ostream
en realidad es un typedef que se refiere a la plantilla de clasebasic_ostream
. Esta plantilla toma dos parámetros de plantilla:char
ychar_traits<char>
. La clasestd::ostream
en sí misma es una especialización de esta plantilla, por eso ves el typedef en tu IDE.Tienes razón en que la clase
std::ostream
proporciona una implementación deoperator<<
que recibe varios tipos como argumentos. Estas funciones de implementación están definidas en los archivos de encabezado de la biblioteca estándar de C++, a los cuales tu IDE debería tener acceso.