Machen Sie eine Benutzer-definierte Klasse std::to_string(Lage)
Ich weiß, es scheint zu viel Java oder C#. Jedoch ist es möglich/gut/klug, um meine eigene Klasse gilt als Eingabe für die Funktion std::to_string
?
Beispiel:
class my_class{
public:
std::string give_me_a_string_of_you() const{
return "I am " + std::to_string(i);
}
int i;
};
void main(){
my_class my_object;
std::cout<< std::to_string(my_object);
}
Wenn es keine solche Sache (und ich denke, dass), was ist der beste Weg, es zu tun?
- Im Zusammenhang gibt es ein standard-Weg, um zu konvertieren eine Klasse zu einem string
- Auch stackoverflow.com/questions/234724/...
- Ja es kann sein.. Aber die Lösungen gibt es, die versuchen, um eine überlastung to_string, anstatt die Klasse to_stringable
- Nein, meine Absicht ist es nicht über die Serialisierung durch Umwandlung in string
- Ich glaube nicht, dass es eine überlastung der
std::to_string
verwendet werden können für das, was Sie wollen, sind. In C++ im Gegensatz zu C#/Java, es gibt keine Basis-Klasse, die alle Klassen Erben, so gibt es keine überschreibbare/overloadableToString()
Methode. - Siehe auch Ist eine Spezialisierung von std::to_string für benutzerdefinierte Datentypen erlaubt, die von der C++ standard?. Die kurze Antwort ist, dass
std::to_string
ist nicht eine Vorlage, so können Sie nicht spezialisiert es. Die andere option ist, um einen Namen zu derstd
namespace, und das ist nicht erlaubt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst einige ADL helfen:
notstd::to_string(blah)
wird ein ADL-Sucheto_string(blah)
mitstd::to_string
im Rahmen.Wir dann die Klasse ändern:
und jetzt
notstd::to_string(my_object)
findet die richtigeto_string
wienotstd::to_string(7)
.Mit ein wenig mehr Arbeit, können wir auch unterstützen
.tostring()
Methoden-Typen werden automatisch erkannt und verwendet.using std::to_string
vor jeder Nutzungto_string
; Sie haben nicht zu verschmutzen des namespace. Stattdessen wird die Verschmutzung innerhalb dernotstd::adl_helper
namespace nur. Rufen Sie einfachnotstd::to_string
jeder Zeit. Ich benutze einefriend to_string
, aber das ist äquivalent zu einer freien Funktionto_string
.Was ist die 'beste' Weg ist eine offene Frage.
Gibt es ein paar Möglichkeiten.
Das erste, was zu sagen ist, dass eine überlastung
std::to_string
für einen benutzerdefinierten Typ ist nicht erlaubt. Wir können nur spezialisieren template-Funktionen und Klassen in derstd
Namensraum für benutzerdefinierte Typen undstd::to_string
ist nicht eine template-Funktion.Gesagt, ein guter Weg, um zu behandeln
to_string
ist viel wie ein operator oder eine Implementierung vonswap
. also erlauben argument-dependent lookup um die Arbeit zu tun.so, wenn wir möchten, zu konvertieren, was zu einem string wir könnten schreiben:
vorausgesetzt, dass x ein Objekt vom Typ X in namespace Y und ich war ein int, dann könnten wir definieren:
das würde jetzt bedeuten, dass:
aufrufen
to_string(x)
tatsächlich wähltY::to_string(const Y::X&)
, undaufrufen
to_string(i)
wähltstd::to_string(int)
Weiter zu gehen, kann es sein, dass Sie wollen to_string viel zu tun das gleiche wie operator<<, also man kann dann geschrieben werden in Bezug auf die anderen:
Definieren Sie Ihre eigenen
to_string
in seinem eigenen Namensraum (z.B.foo
).Und verwenden Sie es als:
Leider, Sie kann nicht definieren, Ihre eigene version von
to_string
im namespacestd
weil acorrding zu den standard - 17.6.4.2.1 Namespace std [namespace.std] (Hervorhebung von Mir):to_string
imstd
für Ihre Klasse.std::to_string()
umgesetzt wurden als Vorlage, könnte man eine Spezialisierungstd::to_string()
für Ihre benutzerdefinierten Typ. Jedoch, es ist implementiert als eine überladene Funktion, daher kann man Sie nicht.Hier eine Alternative Lösung. Nichts unbedingt mehr elegant oder auch Lust, aber es ist eine Alternative Methode. Es wird davon ausgegangen, dass alle Klassen, die Sie beabsichtigen, zu nennen to_string auf eine ToString () - Funktion.
Hier ist ein Funktions-template, das funktioniert nur mit Objekten der Klasse Typ, und rufen Sie eine ToString () - Funktion.
Vielleicht sollten wir es mit std::string als gut.
Hier ist ein Beispiel des Codes im Einsatz. Hinweis: die dummy-namespace to_s. Ich denke, wenn man mit std::to_string in der main-Funktion, es Schritte auf unserem template Funktion name, so haben wir die Einführung der Namen indirekt wie diese. Wenn jemand weiß, der richtige Weg, dies zu tun, würde ich mich über ein Kommentar.
Hier ist was ich habe:
str: ein schöner string, d: 1.100000
a: 1.200000
einem: ein schöner string
a: Ungültiger Status
Dieser hat bereits eine große Antwort aber ich würde gerne vorschlagen, eine alternative, feedback ist willkommen.
Wenn du bist nicht tot Satz auf die Funktion to_string Namen, Sie könnten setzen Sie Ihre eigene ToString-free-Funktion template, mit Spezialisierungen für die Typen, die, unterstützt von to_string:
Die default-Implementierung hier gibt einen string von hex-Werte mit den Werten in den Speicher für die Referenz-Klasse übergeben, während die Spezialisierungen Aufruf std::to_string, damit wird keine Klasse "stringable".
Dann brauchen Sie nur, um Ihre eigene Spezialisierung für Ihre Klasse:
Werden Sie wahrscheinlich wollen einfach nur, um eine überlastung
operator<<()
etwas wie:Alternativ:
Dann können Sie einfach tun:
print_a_string
's Verhalten in deroperator <<()
überlastung (und loswerdenprint_a_string
wie es wahrscheinlich nicht mehr nötig). Nutzen Sie alternativ'print_a_string()
statti
.Können keine neuen überlastungen
to_string
instd
namespace, aber Sie können es tun, in Ihrem Namensraum:Dann können Sie
my::to_string
für alle Typen.to_string
s innamespace my
, und nicht in den namespace des Typs.