В книге "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);
Вы вводите в заблуждение две "гибкости", доступные в этой функции.
часть шаблона (которая, по моему мнению, является той, о которой говорит автор) позволяет вам передать любой std::vector<T>
учитывая, что T
может быть выведено в потоке; т.е. вы можете передать вектор целых чисел, удвоений или даже ваших пользовательских объектов, и функция будет успешно выводить его на данный поток; 1
часть потока (которая привлекла ваше внимание) вместо этого позволяет вам указать любой (узкий) выходной поток для выходной части; это полезно, потому что вы можете вывести свое сообщение (и ваш вектор) на некоторые другие потоки; например, если это сообщение об ошибке, вы хотите cerr
; и, что самое главное, если вы пишете файл, вы передадите поток файлов.
Заметки
std::ostream_iterator
, которая позволяет использовать std::copy
для копирования данных из итераторов контейнеров в выходной поток);