Ist möglich, automatisch von benutzerdefinierter Typ zu STD :: String mit Cout zu erhalten?
-
25-09-2019 - |
Frage
Wie in der Frage, wenn ich einen String -Operator in meiner Klasse definiere:
class Literal {
operator string const () {
return toStr ();
};
string toStr () const;
};
Und dann benutze ich es:
Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;
Mit einem expliziten Guss geht alles richtig, aber wenn ich die (Zeichenfolge) entferne, sagt der Compiler, dass ein Gussbetreiber in STD :: String deklariert wird. Sollte es meinen Typ nicht automatisch werfen? Gelöst: Ich überlastete Operator << (Ostream & OS, Const Literal & L).
Lösung
Nein .. Std :: String müsste einen Konstruktor haben, der wörtlich als Argument betrachtete.
Was Sie tun können, ist Operator << für Ihre buchstäbliche Klasse und lassen Sie ihn dort in den Stream werfen und einfügen.
ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
stream << (string) rhs;
return stream;
}
Andere Tipps
Kurze Antwort: Verwenden Sie weiterhin eine Besetzung oder toStr()
, oder schreibe deine eigenen operator<<
Funktion. (Ich würde bevorzugen l1.toStr()
zu (string)l1
.)
Lange Antwort: Dies könnte funktionieren, wenn die Standardbibliothek eine Funktion hatte
std::ostream& operator<<( std::ostream&, std::string const& );
Was es fast tut, aber technisch nicht. Beide ostream
und string
sind wirklich typedefs von template -Instanziationen. Und es gibt eine Vorlagenfunktion, um eine in den anderen einzuführen.
// 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&);
}
Also, wenn Sie verwenden cout << str
wo die Art von str
ist std::string
, Es kann herausfinden, dass diese Vorlagenfunktion mit Verwendung verwendet wird, mit CharT = char
.
C ++ erlaubt Ihnen jedoch nicht, dass der Compiler sowohl einen impliziten Typumwandlungen herausfindet (Literal
zu string
) und Vorlagenvorlagenparameter abgeben (Parameter (CharT = char
) auf demselben Anruf.