Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does std::cin.getline not have an oveloaded method to take std::string?

Tags:

c++

getline

cin

I'm curious about the technical reason for cin.getline and the global getline function being in different places.

What was the motivation for not simply defining all these function signatures for 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 );

Was it because other types may want to be added and they didn't want to marry the string to cin?

like image 723
M2tM Avatar asked Nov 05 '10 20:11

M2tM


2 Answers

See my answer for a similar question. It might be an oversight by the C++ Standard committee, but it can also be explained with dependency concerns. If the standard would require function overloads for std::string in the <iostream> header then it would require implementers to #include<string> in <iostream>. That's a dependency requirement, which would further slow down compiling anything that requires <iostream> -- even if a compilation unit doesn't itself need std::string.

Do note that on the other hand the <string> header has functions that take a reference to std::basic_istream<> and std::basic_ostream<>; but the standard also requires a header named <iosfwd> which forward-declares all IO facilities, making the <string> header dependable on the compile-time fast <iosfwd> header. A dependency the other way around would be much slower to compile.

like image 122
wilhelmtell Avatar answered Sep 20 '22 13:09

wilhelmtell


More or less. "They" probably didn't want to have std::istream depend on std::string in any way, probably to minimize coupling.

Note that std::getline() is defined in the <string> module.

like image 40
Frédéric Hamidi Avatar answered Sep 16 '22 13:09

Frédéric Hamidi