Icon Ressource

[C++] GetInput Funktionstemplate

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 <string_view>
#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_view prompt = {})
{
  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
}

// Spezialisierung für string, da keine zusätzliche Konvertierung erforderlich ist.
template<>
std::string GetInput(const std::string_view prompt)
{
  std::string line{}; // string für die Eingabe

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

    std::cin.clear(); // ggf. Fehlerflags des cin löschen
  } while (!std::getline(std::cin, line)); // Schleife solange iterieren, wie das Kopieren der Eingabe in den string fehlgeschlägt.

  return line; // string zurückgeben
}


int main()
{
  // Beispiel für die Konvertierung der Eingabe in ein double:
  const auto input{ GetInput<double>("Eingabe: ") };
  std::cout << "Ausgabe: " << input << std::endl;

  // Beispiel für das Einlesen der Eingabe in einen std::string:
  const auto line{ GetInput<std::string>("Eingabe: ") };
  std::cout << "Ausgabe: " << line << std::endl;
}
Autor
german
Aufrufe
1.560
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von german

Zurück
Oben Unten