параметр по умолчанию ostream в функции шаблона

0

В книге "Essential C++" (более конкретно, часть 2.7) автор кратко обсуждает использование шаблонных функций со следующим примером, который отображает диагностическое сообщение, а затем выполняет итерации через элементы вектора

template <typename T> 
void display_message(const string& msg, const vector<T>& vec)
{
    cout << msg; 

    for (int i = 0; i < vec.size(); ++i)
        cout << vec[i] << ' '; 
}

Итак, этот пример меня заинтересовал, потому что я (как многие другие разработчики хоббистов, вероятно) всегда считали само собой разумеющимся, что в большинстве приложений стандартные потоки ввода-вывода используются для связи и обработки данных. Затем автор упоминает, что этот способ реализации display_message более гибкий. Можете ли вы привести мне пример ситуации, когда эта гибкость "светит", так сказать? Другими словами, существует ли случай, когда дополнительный 3-й параметр принимает другое представление ввода/вывода (скажем, встроенное устройство) или просто простое дополнение, которое предполагается использовать с, ну, простыми конструкциями, а не с экстремальными ситуации, которые я пытаюсь описать?

EDIT: Как заметила @Matteo Italia, это объявление функции

void display_message(const string&, const vector<T>&, ostream& = cout); 
Теги:
templates
io

1 ответ

0
Лучший ответ

Вы вводите в заблуждение две "гибкости", доступные в этой функции.

  • часть шаблона (которая, по моему мнению, является той, о которой говорит автор) позволяет вам передать любой std::vector<T> учитывая, что T может быть выведено в потоке; т.е. вы можете передать вектор целых чисел, удвоений или даже ваших пользовательских объектов, и функция будет успешно выводить его на данный поток; 1

  • часть потока (которая привлекла ваше внимание) вместо этого позволяет вам указать любой (узкий) выходной поток для выходной части; это полезно, потому что вы можете вывести свое сообщение (и ваш вектор) на некоторые другие потоки; например, если это сообщение об ошибке, вы хотите cerr; и, что самое главное, если вы пишете файл, вы передадите поток файлов.


Заметки

  1. обратите внимание, что в более "интерфейсах STL 2 -like" обычно вы не получите такой вектор, но, скорее, пару итераторов. На самом деле стандартная библиотека предпочитает еще более абстрактный способ решить эту проблему (std::ostream_iterator, которая позволяет использовать std::copy для копирования данных из итераторов контейнеров в выходной поток);
  2. никмену: Я знаю, и вы меня не убедите.
  • 0
    Спасибо! Это проясняет ситуацию.
  • 0
    @TheSOFan: рад, что это помогло; в этом случае в StackOverflow принято принимать ответ (нажмите на галочку возле подсчета голосов); если вы этого не знали, вы должны сделать это и со своими старыми вопросами (это также дает вам несколько баллов).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню