E 'possibile ottenere fusione automatica da tipo definito dall'utente a std :: string utilizzando cout?
-
25-09-2019 - |
Domanda
Come nella domanda, se mi definisco un operatore di stringa nella mia classe:
class Literal {
operator string const () {
return toStr ();
};
string toStr () const;
};
e poi lo uso:
Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;
con un cast tutto esplicito va a destra, ma se mi tolgo la (stringa) il compilatore dice che ha bisogno di un operatore di cast dichiarata in std :: string. Non dovrebbe lanciare il mio tipo automaticamente? RISOLTO:. Sto sovraccarico operatore << (ostream & os, const letterale & l)
Soluzione
No .. std :: string avrebbe dovuto avere un costruttore che ha avuto come argomento letterale.
Che cosa si potrebbe fare è operatore di sovraccarica << per la classe letterale e lo hanno gettato e l'inserto nel flusso in là.
ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
stream << (string) rhs;
return stream;
}
Altri suggerimenti
Risposta breve: Continua a utilizzare un cast o toStr()
, o scrivere la propria funzione operator<<
. (Io preferirei l1.toStr()
a (string)l1
.)
Risposta lunga: Questo lavoro potrebbe se la libreria standard aveva una funzione
std::ostream& operator<<( std::ostream&, std::string const& );
Il che quasi lo fa, ma non tecnicamente. Sia ostream
e string
sono davvero typedef di istanze di modello. E c'è una funzione di modello per l'inserimento di uno dentro l'altro.
// 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&);
}
Quindi, quando si utilizza cout << str
dove il tipo di str
è std::string
, si può capire per utilizzare tale funzione del modello, con CharT = char
.
Ma C ++ non permette di avere la cifra compilatore fuori sia una conversione di tipo implicita (Literal
a string
) e parametri di modello funzione modello dedurre (CharT = char
) sulla stessa chiamata.