2010-11-05 8 views
5

Je suis curieux de connaître la raison technique pour cin.getline et la fonction global getline étant dans des endroits différents.Pourquoi std :: cin.getline n'a-t-il pas une méthode surchargée pour prendre std :: string?

Quelle a été la motivation pour ne pas définir simplement toutes ces signatures de fonction pour cin:

//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); 

Était-ce parce que d'autres types peuvent vouloir ajouter et ils ne voulaient pas se marier avec la chaîne à cin?

+0

duplication possible de [Pourquoi les classes std :: fstream ne prennent-elles pas une chaîne std :: string?] (Http://stackoverflow.com/questions/32332/why-dont-the-stdfstream-classes-take- a-stdstring) – wilhelmtell

+0

@wilhelmtell: Cela semble être une question complètement différente. – UncleBens

+0

@UncleBens la question est très similaire, même si les noms sont différents. La réponse devrait être (presque) identique. – wilhelmtell

Répondre

4

Voir ma réponse pour a similar question. Cela peut être un oubli de la part du comité C++ Standard, mais cela peut également être expliqué par des questions de dépendance. Si la norme requiert des surcharges de fonction pour std::string dans l'en-tête <iostream>, les implémenteurs doivent alors être #include<string> dans <iostream>. C'est une exigence de dépendance qui ralentirait encore la compilation de tout ce qui nécessite <iostream> - même si une unité de compilation n'a pas elle-même besoin de std::string.

Notez par contre que l'en-tête <string> a des fonctions qui prennent une référence à std::basic_istream<> et std::basic_ostream<>; mais la norme requiert également un en-tête nommé <iosfwd> qui déclare à l'avance toutes les fonctions IO, ce qui rend l'en-tête <string> fiable pour l'en-tête rapide <iosfwd> de la compilation. Une dépendance inverse serait beaucoup plus lente à compiler.

0

Il y a plusieurs endroits où le comité de normalisation C++ n'a pas vraiment optimiser l'interaction entre installations dans la bibliothèque standard. Std :: string et son utilisation dans la bibliothèque en fait partie.

Un autre exemple est std :: swap. Beaucoup de conteneurs ont une fonction d'échange , mais aucune surcharge de std :: swap n'est fournie. La même chose vaut pour std :: sort.

J'espère que toutes ces petites choses seront corrigés dans la prochaine norme.

-Christopher

L'ajout de ce post, je trouve dans cet autre fil, car il semble pertinent et d'accepter une réponse.

Questions connexes