Si la define operator<<
como función miembro, tendrá una sintaxis descompuesta diferente a la que tendría si usara una función no miembro operator<<
. Un no miembro operator<<
es un operador binario, donde un miembro operator<<
es un operador unario.
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
Entonces ... ¿cómo los llamas realmente? Los operadores son extraños de alguna manera, te desafiaré a que escribas la operator<<(...)
sintaxis en tu cabeza para que las cosas tengan sentido.
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
O puede intentar llamar al operador binario que no es miembro:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
No tiene la obligación de hacer que estos operadores se comporten de manera intuitiva cuando los convierte en funciones miembro, puede definir operator<<(int)
desplazamiento a la izquierda de alguna variable miembro si lo desea, comprenda que las personas pueden estar un poco desprevenidas, sin importar cuántos comentarios pueda hacer escribir.
Casi por último, puede haber ocasiones en las que ambas descomposiciones para una llamada de operador sean válidas, puede tener problemas aquí y aplazaremos esa conversación.
Por último, tenga en cuenta lo extraño que podría ser escribir un operador de miembro unario que se supone que debe verse como un operador binario (ya que puede hacer que los operadores de miembro sean virtuales ..... también intentando no delegar y ejecutar esta ruta ... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
Esta sintaxis irritará a muchos programadores ahora ...
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
Observe cómo cout
es el segundo argumento de la cadena aquí ... ¿extraño verdad?