Почему std :: cin.getline не имеет oveloaded метода для взятия std :: string? - PullRequest
5 голосов
/ 05 ноября 2010

Мне любопытно, по какой технической причине cin.getline и функция global getline находятся в разных местах.

Что послужило мотивацией для не простоопределение всех этих сигнатур функций для 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 );

Возможно, из-за того, что другие типы могут быть добавлены, и они не хотят соединять строку с cin?

Ответы [ 3 ]

4 голосов
/ 06 ноября 2010

Смотрите мой ответ для аналогичного вопроса . Это может быть недосмотр со стороны комитета C ++ Standard, но это также можно объяснить проблемами с зависимостями. Если стандарт потребует перегрузок функций для std::string в заголовке <iostream>, тогда для разработчиков потребуется #include<string> в <iostream>. Это требование зависимости, которое еще больше замедлит компиляцию всего, что требует <iostream> - даже если самому модулю компиляции не требуется std::string.

Обратите внимание, что с другой стороны, заголовок <string> имеет функции, которые ссылаются на std::basic_istream<> и std::basic_ostream<>; но стандарт также требует заголовок с именем <iosfwd>, который объявляет все средства ввода-вывода и делает заголовок <string> зависимым от быстрого <iosfwd> заголовка во время компиляции. Напротив, зависимость компилируется гораздо медленнее.

4 голосов
/ 06 ноября 2010

Больше или меньше. «Они», вероятно, не хотели, чтобы std :: istream зависело от std :: string каким-либо образом, возможно, чтобы минимизировать связь .

Обратите внимание, что std :: getline () определено в модуле <string>.

0 голосов
/ 06 ноября 2010

Есть несколько мест, в которых комитет по стандартизации C ++ действительно не оптимизировал взаимодействие между средствами стандартной библиотеки.

std :: string и его использование в библиотеке - одно из них.

Еще один пример - std :: swap.Многие контейнеры имеют функцию-член swap, но перегрузка std :: swap не предоставляется.То же самое касается std :: sort.

Я надеюсь, что все эти мелочи будут исправлены в следующем стандарте.

-Christopher

Добавление этого поста я нашел в другой ветке, потому что оно кажется уместным и принимает ответ.

...