Anzeige:
Ergebnis 1 bis 2 von 2

Thema: C++: Hilfe fuer old school std::distance Aufruf benoetigt

  1. #1
    Registrierter Benutzer Avatar von phate
    Registriert seit
    14.02.2003
    Beiträge
    149

    C++: Hilfe fuer old school std::distance Aufruf benoetigt

    Hi zusammen,

    als Sysadmin, sprich Nicht-C++-Programmierer beisse ich mir gerade die Zaehne an einem C++ Programm aus, das sich nicht mit meinem Sun Studio Compiler kompilieren lassen moechte, weil der die gaengige Version von std::distance nicht kennt.

    Koennte daher mal bitte ein C++ Eingeweihter einen Blick auf den folgenden Schnipsel werfen und mir sagen, wie sich die Logik um std::distance so umbauen laesst, dass ein std::distance Aufruf mit 3 Argumenten bei rauskommt, wie er dem alten Prototyp

    Code:
    template <class InputIterator, class Distance>
    void distance(InputIterator first, InputIterator last, Distance& n);

    aus dem STL Standard genuegt [1]? Hier der relevante Schnipsel

    Code:
       
    std::string Message::Headers::operator[](const std::string header_) const
        {
            std::string retval;
            std::string::iterator i;
    
            if (this->rawContents.substr(0U, header_.size()) == header_)
            {
                retval = this->rawContents;
            } else {
                std::string tmp = "\r\n" + header_;
                size_t position = this->rawContents.find(tmp);
                if (position == std::string::npos)
                    return "";
    
                retval = this->rawContents.substr(position + 2);
            }
    
            retval = retval.substr(retval.find(':') + 1);
            while (isspace(retval[0]))
                retval.erase(retval.begin());
    
            for (i = retval.begin(); i != retval.end(); i++)
            {
                if (*i == '\r')
                {
                    return retval.substr(0, std::distance(retval.begin(), i));
    
                                                    ^^^^ Hierum gehts
    
                }
            }
            return "";
        }
    Eigentlich muss doch nur eine Distance Variable definiert (und auf 0 gesetzt) werden, deren Zeiger man als 3. Argument an std::distance uebergibt. Eigentlich ..... mit meinen C-only-Kenntnissen scheiterts schon beim Definieren dieser Variable. Feedback ist daher sehr willkommen.

    Umsteigen auf stlport4 fuers Kompilieren ist uebrigens leider keine Variante.

    Sebastian

    [1] http://www.sgi.com/tech/stl/distance.html

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    [...]dass ein std::distance Aufruf mit 3 Argumenten bei rauskommt, wie er dem alten Prototyp [...] aus dem STL Standard genuegt
    Die SGI STL war niemals ein Standard im engen Sinne, dies nur als Anmerkung.

    Eigentlich muss doch nur eine Distance Variable definiert (und auf 0 gesetzt) werden, deren Zeiger man als 3. Argument an std::distance uebergibt. Eigentlich ..... mit meinen C-only-Kenntnissen scheiterts schon beim Definieren dieser Variable.
    Richtig, das ist ein möglicher Weg. Eine Variable kannst du in C++ im Prinzip genause deklarieren wie in C. Ich spekuliere jetzt einfach mal das du versucht hast eine Variable vom Typ "Distance" anzulegen wie in "Distance i = 0;" und der Compiler dann gemeckert hat, weil er Distance nicht kennt. Das kommt daher, das "Distance" im "std::distance"-Template nur ein Platzhalter für einen konkreten Typ ist (z.B. int könnte das sein).

    Ich würde aber vorschlagen, den distance-Aufruf an der Stelle komplett wegzulassen, denn die Iteratoren von std::stringen unterstützen auch Subtraktion. Du kannst also an der entsprechen Stelle auch einfach
    "return retval.substr(0, i - retval.begin() );" schreiben. Obacht nur für den Fall, dass jemand auf die Idee kommt, std::string gegen etwas anderes auszutauschen, dann würde das evtl. nicht mehr funktionieren.

    Eigentlich könnte man die letzte Schleife komplett weglassen, und std::string::find benutzen,
    "
    std::string::size_type pos = retval.find('\r');
    return pos == std::string::npos ? "" : retval.substr(0, pos);
    "
    , oder so ähnlich.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •