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


  • Mod

    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 😃


Anmelden zum Antworten