unarios sobrecarga sencillos restricciones relacionales operadores operador matrices ejemplos acerca c++ operator-overloading

sencillos - sobrecarga de operadores unarios en c++



Obscurecer la sobrecarga del operador C++ (2)

Tengo el siguiente código:

#include <iostream> using namespace std; ostream& f(ostream& os) { return os << "hi"; } int main() { cout << "hello " << f << endl; return 0; }

Y de alguna manera esto funciona, la salida es "hola". ¿Cómo se interpreta esto por el compilador? No entiendo cómo se puede insertar una función en una secuencia.


std::ostream::operator<< tiene una sobrecarga que acepta una función como parámetro; y el cuerpo de esa sobrecarga es invocar la función dada.

Esto es exactamente cómo funciona endl de hecho. endl es en realidad una función similar a:

ostream &endl(ostream &os) { os << ''/n''; os.flush(); return os; }


std::ostream tiene un operator<< sobrecarga que recibe un puntero a una función con la firma como la que escribió ( número 11 en esta lista ):

basic_ostream& operator<<( std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

que simplemente llama a la función dada pasando a sí misma como argumento. Esta sobrecarga (junto con varias otras similares) está ahí para permitirle implementar manipuladores de flujo , es decir, las cosas que genera en el flujo con << y cambia el estado del flujo desde allí. Por ejemplo, nuestra versión de (incorrectamente) ubicua std::endl puede implementarse como

std::ostream &myendl(std::ostream &s) { s<<''/n''; s.flush(); return s; }

que luego se puede usar exactamente como " std::endl " std::endl :

std::cout<<"Hello, World!"<<myendl;

(La implementación real tiene una plantilla y es un poco más complicada porque tiene que funcionar incluso con flujos amplios, pero se le ocurrió la idea)