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;
}