Pourquoi std :: cin.getline pas une méthode surchargée pour prendre std :: string?

StackOverflow https://stackoverflow.com/questions/4110021

  •  29-09-2019
  •  | 
  •  

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?

Était-ce utile?

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.

-Christopher

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top