В книге «Essential C++» (более конкретно, часть 2.7) автор кратко обсуждает использование функций шаблона со следующим примером, который отображает диагностическое сообщение, а затем выполняет итерации через элементы векторostream параметр по умолчанию в функции шаблона
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);
Этот третий аргумент не имеет смысла (хотя он компилируется), вы уверены, что это написано именно так? Разве это не похоже на 'ostream & os = cout', а в остальной части тела он использует' os' вместо 'cout'? –
А, да! Виноват. Я представил объявление функции. Вы правы, конечно. – TheSOFan
Ум, теперь определение выключено ... вам не хватает третьего параметра. –