Почему getline написано так странно? - PullRequest
0 голосов
/ 29 ноября 2018

Я не понимаю проектные решения, стоящие за функцией getline в C ++.

Почему в качестве аргументов принимается поток и строка по ссылке, только чтобы вернуть тот же поток, который был передан?Кажется более интуитивно понятным - принимать поток в качестве аргумента, а затем возвращать прочитанную строку.Возврат того же потока позволяет вам связать вызов, но кто-нибудь действительно захочет использовать getline(getline(stream, x), y)?

Кроме того, почему функция не находится в пространстве имен std, как остальные части стандартной библиотеки?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Почему он принимает поток и строку по ссылке в качестве аргументов, только чтобы вернуть тот же поток, который был передан?

В библиотеке потоков есть общий шаблон длясделай это.Это означает, что вы можете проверить выполняемую операцию во время ее выполнения.Например:

std::string line;
while(std::getline(std::cin, line))
{
    // use line here because we know the read succeeded
}

Вы также можете создавать сжатые парсеры с помощью «цепочки» потоковых функций:

std :: string key, value;

if(std::getline(std::getline(in, key, '='), value))
    my_map[key] = value;

Кажется более интуитивно понятным - принимать поток как аргумент, а затем возвращать прочитанную строку.

Проблема с возвратом новой строки при каждом вызове состоит в том, что вы постоянно выделяете для них новую память вместо того, чтобы повторно использовать память, уже выделенную для строки, которую вы передали, или ту, которая была получена при повторении цикла.

// Here line will not need to allocate memory every time
// through the loop. Only when it finds a longer line than
// it has capacity for:

std::string line;
while(std::getline(std::cin, line))
{
    // use line here because we know the read succeeded
}
0 голосов
/ 29 ноября 2018

Если функция вернула строку, не было бы никакого способа указать, что чтение не удалось, так как все строковые значения являются допустимыми значениями, которые могут быть возвращены этой (или любой другой) функцией.С другой стороны, поток имеет множество флагов индикаторов ошибок, которые можно проверить кодом, вызывающим getline.Таким образом, люди могут писать код вроде:

 while( std::getline( std::cin, somestring )) {
     // do stuff with somestring
 }

, и трудно понять, как можно написать подобный код, если getline вернул строку.

почему функция нев пространстве имен std, как и в остальной части стандартной библиотеки?

Это в пространстве имен std - что заставляет вас думать иначе?

...