2010-11-05 7 views
5

Ich bin neugierig auf den technischen Grund für cin.getline und die global getline Funktion an verschiedenen Orten.Warum hat std :: cin.getline keine oveloaded-Methode, um std :: string zu übernehmen?

Was war die Motivation für nicht einfach, alle diese Funktionssignaturen für cin definieren:

//THESE TWO EXIST 
istream& cin::getline (char* s, streamsize n); 
istream& cin::getline (char* s, streamsize n, char delim); 

//THESE TWO COULD EXIST 
istream& cin::getline (string &s); 
istream& cin::getline (string &s, char delim); 

War es, weil andere Arten hinzugefügt werden möchten, und sie wollen nicht die Zeichenfolge heiraten cin?

+0

möglich Duplikat von [Warum nehmen die std :: fstream-Klassen keine std :: string?] (Http://stackoverflow.com/questions/32332/why-dont-the-stdfstream-classes-take- a-stdstring) – wilhelmtell

+0

@wilhelmtell: Das scheint eine ganz andere Frage zu sein. – UncleBens

+0

@UncleBens die Frage ist sehr ähnlich, auch wenn die Namen unterschiedlich sind. Die Antwort sollte (fast) identisch sein. – wilhelmtell

Antwort

4

Siehe meine Antwort für a similar question. Es könnte ein Versehen des C++ - Standardausschusses sein, aber es kann auch mit Abhängigkeitsanliegen erklärt werden. Wenn der Standard eine Funktionsüberlastung für std::string in dem Header <iostream> erfordern würde, würde er Implementierer zu #include<string> in <iostream> erfordern. Das ist eine Abhängigkeitsanforderung, die das Kompilieren von allem, was <iostream> erfordert, weiter verlangsamen würde - selbst wenn eine Kompilierungseinheit selbst nicht std::string benötigt.

Beachten Sie, dass auf der anderen Seite der Header Funktionen hat, die einen Verweis auf std::basic_istream<> und std::basic_ostream<>; aber der Standard erfordert auch eine Kopfzeile mit dem Namen <iosfwd>, die alle IO-Einrichtungen nach vorne deklariert, wodurch die Kopfzeile <string> von der schnellen Kopfzeile der Kompilierungszeit <iosfwd> abhängig ist. Eine Abhängigkeit andersherum wäre viel langsamer zu kompilieren.

0

Es gibt mehrere Orte, an denen das C++ Standard Komitee nicht wirklich die Interaktion zwischen Einrichtungen in der Standardbibliothek zu optimieren.

Std :: String und seine Verwendung in der Bibliothek ist einer von diesen.

Ein anderes Beispiel ist std :: swap. Viele Container haben ein Tauschelement Funktion, aber keine Überladung von std :: swap wird geliefert. Das gleiche gilt für Std :: Sort.

Ich hoffe, alle diese kleinen Dinge werden im kommenden Standard behoben werden.

-Christopher

diesen Beitrag Hinzufügen ich in dem anderen Thread gefunden, weil sie eine Antwort relevant und zu akzeptieren scheint.