Pourquoi std :: cin.getline pas une méthode surchargée pour prendre std :: string?
Question
Je suis curieux de savoir la raison technique cin.getline fonction globale getline être dans des endroits différents.
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?
La solution
Voir ma réponse pour une question similaire. Il pourrait être un oubli par le comité standard C ++, mais il peut aussi être expliqué avec des problèmes de dépendance. Si la norme nécessiterait de fonction pour les surcharges std::string
dans l'en-tête de <iostream>
alors il faudrait à #include<string>
dans implémenteurs <iostream>
. C'est une exigence de dépendance, qui encore ralentir la compilation qui nécessite tout <iostream>
-. Même si une unité de compilation ne se std::string
ont besoin
Notez que la d'autre part l'en-tête de <string>
a des fonctions qui prennent une référence à std::basic_istream<>
et std::basic_ostream<>
; mais la norme exige également un en-tête nommé <iosfwd>
qui déclare l'avant toutes les installations IO, ce qui rend l'en-tête <string>
fiable sur la compilation en-tête <iosfwd>
de rapide. Une dépendance dans l'autre sens autour serait beaucoup plus lent à compiler.
Autres conseils
Plus ou moins. « Ils » ne voulaient probablement pas avoir std :: istream dépendent std :: string de quelque façon, sans doute pour minimiser couplage .
Notez que std :: getline () est défini dans le module <string>
.
Il y a plusieurs endroits où le C ++ comité de normalisation n'a pas vraiment optimiser l'interaction entre installations de la bibliothèque standard.
std :: string et son utilisation dans la bibliothèque est l'un de ceux-ci.
Un autre exemple est std :: swap. Beaucoup les conteneurs ont un élément d'échange fonction, mais pas de surcharge de std :: échange est fourni. C'est la même chose pour std :: sort.
J'espère que toutes ces petites choses seront fixe la norme à venir.
L'ajout de ce post, je trouve dans cet autre fil, car il semble pertinent et d'accepter une réponse.