2013-10-12 3 views
0

В книге «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); 
+0

Этот третий аргумент не имеет смысла (хотя он компилируется), вы уверены, что это написано именно так? Разве это не похоже на 'ostream & os = cout', а в остальной части тела он использует' os' вместо 'cout'? –

+0

А, да! Виноват. Я представил объявление функции. Вы правы, конечно. – TheSOFan

+0

Ум, теперь определение выключено ... вам не хватает третьего параметра. –

ответ

0

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

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

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


Примечания

  1. обратите внимание, что в более «СТЛ -как» интерфейсы обычно вы не будете получать вектор подобное, но более вероятно, пару итераторов , На самом деле стандартная библиотека предпочитает еще более абстрактный способ решить эту проблему (std::ostream_iterator, что позволяет использовать std::copy для копирования данных из итераторов контейнеров в выходной поток);
  2. nitpickers: Я знаю, и вы меня не убедите.
+0

Спасибо! Это проясняет ситуацию. – TheSOFan

+0

@ THESOFan: рад, что это помогло; в этом случае на StackOverflow принято * принимать * ответ (нажмите галочку возле подсчета голосов); если вы этого не знали, вы должны сделать это и с вашими более старыми вопросами (это также дает вам несколько моментов). –

Смежные вопросы