PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Hilfe fuer old school std::distance Aufruf benoetigt



phate
26-02-2009, 21:15
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


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


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



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. :o 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

locus vivendi
27-02-2009, 12:00
[...]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.