¿Es posible obtener un reparto automático del tipo definido por el usuario a std :: string usando cout?
-
25-09-2019 - |
Pregunta
Como en la pregunta, si defino un operador de cadenas en mi clase:
class Literal {
operator string const () {
return toStr ();
};
string toStr () const;
};
Y luego lo uso:
Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;
Con un reparto explícito, todo sale bien, pero si elimino la (cadena), el compilador dice que necesita un operador de reparto declarado en std :: string. ¿No debería lanzar mi tipo automáticamente? Resuelto: estoy sobrecargando el operador << (Ostream & OS, const literal y l).
Solución
No ... std :: string tendría que tener un constructor que tomara literal como argumento.
Lo que podría hacer es sobrecargar el operador << para su clase literal y tenerlo fundido e inserte en la transmisión allí.
ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
stream << (string) rhs;
return stream;
}
Otros consejos
Respuesta corta: sigue usando un elenco o toStr()
, o escribe el tuyo operator<<
función. (Yo preferiría l1.toStr()
a (string)l1
.)
Respuesta larga: Esto podría funcionar si la biblioteca estándar tuviera una función
std::ostream& operator<<( std::ostream&, std::string const& );
Lo que casi hace, pero no técnicamente. Ambas cosas ostream
y string
son realmente typedefs de instancias de plantilla. Y hay una función de plantilla para insertar una en la otra.
// This is somewhat simplified. For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
typedef basic_string<char> string;
typedef basic_ostream<char> ostream;
template <typename CharT>
basic_ostream<CharT>& operator<<(
basic_ostream<CharT>&,
basic_string<CharT> const&);
}
Entonces cuando usas cout << str
donde el tipo de str
es std::string
, puede averiguar usar esa función de plantilla, con CharT = char
.
Pero C ++ no le permite que el compilador descubra tanto una conversión de tipo implícito (Literal
a string
) y deducir los parámetros de la plantilla de función de la plantilla (CharT = char
) en la misma llamada.