Wie wird >> für string gemacht?



  • Ich bastle mir mein eigenes string und bin beim denken wie >> zu implementieren. Soweit hab ich das:

    inline istream& operator >> (istream& i, string& x)
    {
    	char c;
    	while (i.get(c) && std::isspace(c));
    	if (!i) return i;
    	x.clear();
    	x += c;
    	while (i.get(c) && !std::isspace(c)) x += c;
    	return i;
    }
    

    Ob das das korrektes Benehmen eines strings ist, weiß ich nicht.



  • Irgendjemand? 😕



  • Wie du >> überlädst ist dir überlassen. Ob das raus kommt, was du willst kannst du selbst prüfen.



  • Ich denke auch, dass,wenn es das macht, was du willst, dann ist es richtig. 😉 - Die Funktionalität der Standard Strings bekommst du (sehr wahrscheinlich) eh nicht hin.

    Ein paar Sachen haben mich noch stutzig gemacht.

    inline istream& operator >> (istream& i, string& x)
    {
        if (!i) return i; // Würde das hier nicht mehr Sinn machen?
        char c;
        while (i.get(c) && !std::isspace(c)); //Ist das nicht auch hier so?
        //while (i.get(c) && std::isspace(c)); 
        //if (!i) return i;
        x.clear();
        x += c;
        while (i.get(c) && !std::isspace(c)) x += c;
        return i;
    }
    


  • Die Funktionalität ist eigentlich korrekt, man kann es aber noch ein wenig optimieren 😉

    inline istream& operator >> (istream& i, string& x)
    {
        //sentry übernimmt das aufräumen
        istream::sentry sentry(i);
        if(!sentry) return i;
        x.clear();
        //whitespaces sollten mit der aktuellen streamlocale gecheckt werden
        //desweiteren sollten für i.width!=0 nur maximal i.width zeichen gelesen werden
        std::size_t max=i.width()!=0?i.width():x.max_size();
        std::size_t i=0;
        while (i.get(c) && !std::isspace(c,i.getloc()) && i!=max)
        {
             x += c;
             ++i;
        }
        return i;
    }
    

Anmelden zum Antworten