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)