Mit cin beliebig viele Zahlen, eines bestimmten Zahlentyps, eingeben
-
Hi,
- Ich will, dass der Nutzer beliebig viele Zahlen eingibt. Die Zahlen bekommt der Nutzer dann in einem std::vector zurückgeliefert.
- Den Datentyp für die Zahlen soll der Nutzer angeben. Ist es kein geeigneter Typ für eine Zahl, soll es ein Compilerfehler geben.
- Ich will keinen string->stringstream Umweg gehen.Das habe ich aktuell:
#include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <type_traits> using namespace std; template< char C > std::istream& skip_chars( std::istream& in ) { const char line_feed = '\n'; const char carriage_return = '\r'; for(char c;;) { if( in >> c && (c==line_feed || c==carriage_return) ) { in.setstate( std::ios_base::eofbit ); return in; } else if( c != C ) return in.unget(); } } template< typename U, typename ... Ts > struct any_of_type_helper { static constexpr bool value = ( std::is_same< U, Ts >::value || ... ); using type = typename std::enable_if< value, U >::type; }; template< typename T > using any_of_type = typename any_of_type_helper< T, int, float, double >::type; template< typename T > vector< any_of_type<T> > enter_some_numbers() { vector<T> numbers; for( T num; cin >> std::noskipws >> skip_chars<' '> >> num; numbers.emplace_back(num) ); return numbers; } int main() { cout << "enter some numbers: "; auto numbers = enter_some_numbers<int>(); cout << "your input was: "; for( auto num: numbers ) cout << num << ' '; }
Hat jemand Verbesserungsvorschläge oder einen ganz anderen Lösungsansatz?
Danke im Voraus
-
Was kann das jetzt besser als
vector<int> data(istream_iterator<int>(cin), istream_iterator<int>());
?
-
SeppJ schrieb:
Was kann das jetzt besser als
vector<int> data(istream_iterator<int>(cin), istream_iterator<int>());
?
Da hänge ich in einer Schleife fest, die ich dann abbrechen müsste.
-
Ahh, jetzt weiß ich was du meinst, SeppJ. Ich kann ja sozusagen mit Strg+C EOF auslösen.
Da hab ich wieder viel zu kompliziert gedacht. Danke dir