Die perfekte Convert-to-string-Funktion in C++

Software-Entwickler und Programmierer möchten häufig Objekte in Strings konvertieren, zum Beispiel um ein Mitteilungsfeld mit der Anzahl der Wörter in einem Dokument anzuzeigen. Für diese Aufgabe gibt es mehrere Lösungsmöglichkeiten, wie Listing A zeigt: sprintf, ecvt oder die nicht-portable Funktion _itoa (aus Win32).

All diese Verfahren entstammen ursprünglich der Programmiersprache C, wobei jedes einzelne auch seine Nachteile hat:

  • sprintf ist nicht typsicher, benötigt einen Puffer und ist schwierig in der Anwendung.
  • Die Syntax von ecvt ist recht eigentümlich, schwer verständlich und funktioniert nur mit Zahlen.
  • _itoa funktioniert nur mit Ganzzahlen und ist außerdem noch nicht einmal portabel.

In diesem Artikel wird eine einfache und effiziente Methode gezeigt, wie man jeden Datentyp in einen String verwandeln kann. Sie funktioniert für jeden Typ, der über einen überladenen Operator

Version 1.0: to_string

Um typsicher zu sein, muss die Methode mit allen Datentypen funktionieren. Daher empfiehlt sich der Einsatz von Templates:

Diese Lösung entstammt den STL-Streams (Standard Template Library). Außer File-Streams (basic_[i/o]fstream-Klassen) bietet STL auch String-Streams. Jedem String-Stream liegt eine Zeichenfolge zugrunde. Sobald man die Daten geschrieben hat, kann man sie als String behandeln und auf die Member-Funktion str() zugreifen, die einen std::(basic_)string ausgibt. Listing B zeigt die erste Version von to_string.

Die Funktion to_string funktioniert mit jedem Datentyp, der über einen überladenen Operator I und char.

Warum sollte man to_string benutzen?

Das Verhalten von to_string kann emuliert werden, wie Listing C zeigt. Es ist nur eine Geschmacksfrage, ob man to_string bevorzugt. Einer der Vorteile von to_string ist das Debugging. Wenn man eine std::string-Variable betrachtet, wird man auf jeden Fall einen const char *-Zeiger finden (einen String, wie zu erwarten). Dies ist für einen stringstream nicht immer der Fall, da die zugrunde liegende Implementierung mehrere Puffer enthalten kann, die nur zusammengefügt werden, wenn die Funktion str() aufgerufen wird.

Version 1.5: str_stream

Das Template to_string war schon ein Schritt in die richtige Richtung, aber eventuell möchte man ähnlich wie in Listing D gezeigt vorgehen. Allerdings ist diese Methode nicht portabel und möglicherweise gefährlich.

Etwas Ähnliches wie Listing D erreicht man mit einer Funktion, die einen Proxy mit einem zugrunde liegenden stringstream ausgibt. Alles, was an den Proxy geschrieben wird, wird auch an den stringstream geschrieben, wie Listing E zeigt. Dann werden die Daten implizit in einen String konvertiert (operator std::string()).

Falls man eine explizite Umwandlung wünscht, kann man as_string verwenden, inzwischen ohne Nebeneffekte (Listing F).

Die Implementierung von as_string kompliziert den Code allerdings wegen eines Bugs in Visual C++ 6. Der Code führt Folgendes aus:

  • Bei einem Wert str_stream() some_value wird const str_stream & ausgegeben (wie bei Streams üblich).
  • Bei as_string (str_stream wird ein String ausgeben.

Da man weniger Code schreiben muss, wird man wahrscheinlich str_stream() gegenüber to_string() den Vorzug geben.

Page: 1 2

ZDNet.de Redaktion

Recent Posts

Google schließt weitere Zero-Day-Lücke in Chrome

Hacker nutzen eine jetzt gepatchte Schwachstelle im Google-Browser bereits aktiv aus. Die neue Chrome-Version stopft…

2 Stunden ago

Hacker greifen Zero-Day-Lücke in Windows mit Banking-Trojaner QakBot an

Microsoft bietet seit Anfang der Woche einen Patch für die Lücke. Kaspersky-Forscher gehen davon aus,…

3 Stunden ago

Adobe schließt neun kritische Lücken in Reader und Acrobat

Das jüngste Update bringt insgesamt zwölf Fixes. Schadcode lässt sich unter Umständen ohne Interaktion mit…

10 Stunden ago

Fabrikautomatisierung: Siemens integriert SPS-Ebene

Eine softwarebasierte Workstation soll es Ingenieuren erlauben, sämtliche Steuerungen zentral zu verwalten. Pilotkunde ist Ford.

11 Stunden ago

Ebury-Botnet infiziert 400.000 Linux-Server weltweit

Kryptodiebstahl und finanzieller Gewinn sind laut ESET-Forschungsbericht die vorrangigen neuen Ziele.

23 Stunden ago

Sicherheitslücken in Überwachungskameras und Video-Babyphones

Schwachstellen aus der ThroughTek Kaylay-IoT-Plattform. Dringend Update-Status der IoT-Geräte prüfen.

23 Stunden ago