Resource icon

[C++] GetInput Funktionstemplate - Auf Benutzereingabe warten und in spezifizierten Typ konvertieren

Programmiersprache(n)
C++
Betriebssystem(e)
unspezifisch
Das folgende Template liest eine Benutzereingabe vollständig ein und sorgt somit automatisch dafür, dass keine Zeichen im cin verbleiben. Nur vollständig konvertierbare Eingaben werden als gültig gewertet. Alle Zieltypen, für die der >> Operator eines istringstreams überladen ist, werden unterstützt.

C++:
#include <iostream>
#include <string>
#include <sstream>


/** \brief  Auf Benutzereingabe warten und in spezifizierten Typ konvertieren
*
*  \param  Eingabeaufforderung (optional)
*
*  \return konvertierte Eingabe zum im Templateparameter angegebenen Typ
*/
template<typename T>
T GetInput(const std::string& prompt = std::string{})
{
  T out{}; // zurückzugebender Wert
  std::istringstream linestream; // Stream zur Konvertierung der Eingabe

  do // Schleifenanfang
  {
    if (!prompt.empty()) // Wenn eine Eingabeaufforderung übergeben wurde ...
      std::cout << prompt << std::flush; // ... diese ausgeben.

    std::cin.clear(); // ggf. Fehlerflags des cin löschen
    linestream.clear(); // ggf. Fehlerflags des stringstreams löschen

    std::string line; // string für die Eingabe

    if (std::getline(std::cin, line)) // Gesamte Eingabe in den string kopieren und falls das erfolgreich war, ...
      linestream.str(line); // ... Eingabestring dem Puffer des stringstreams zuweisen.

  } while (!(linestream >> out) || !linestream.eof()); // Schleife solange iterieren, wie die Konvertierng mittels >> Operator fehlgeschlagen ist
                                                       //  oder die Konvertierung vor dem Ende des Streams abgebrochen wurde.
  return out; // konvertierten Wert zurückgeben
}


// Beispiel:

int main()
{
  std::cout << "Ausgabe: " << GetInput<double>("Eingabe: ") << std::endl;
}
Autor
German
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Oben