2017-01-20 8 views
-1

Проблема: перегрузить оператор << по умолчанию для переменной vector<int> v, так что cout << v будет печатать каждый элемент последовательно. Здесь я видел один вариант, предложенный Джейсон Айверсон в previous questionОператор перегрузки C++ с/без определения шаблона

template<typename T> 
std::ostream& operator<<(std::ostream& s, std::vector<T> t) { 
    s << "["; 
    for (std::size_t i = 0; i < t.size(); i++) { 
     s << t[i] << (i == t.size() - 1 ? "" : ","); 
    } 
    return s << "]" << std::endl; 
} 

Очевидно, что это должно работать для любого типа элементов, однако, так как я озабочен только int, я упростил функцию

ostream& operator << (ostream &os, const vector<int> &v){ 
    for (auto x: v){ 
     os << " " << x; 
    } 
    return os; 
} 

Он просто отлично работает.

Так что мой вопрос

  1. Насколько vector<int> v обеспокоен, что такое предостережение не используя template?
  2. Помимо общего назначения, в чем преимущество решения Джейсона?

Спасибо!


Более глубокие мысли: выше вопрос был плохо сформулирован, и благодаря комментариям, я считаю, что это имеет смысл перефразировать его. Вопрос: в C++, Какова стоимость использования template, где достаточно однотипной функции?


Кредиты @Marco A и @Walter, этот вопрос может быть закрыт.

+4

Знаете ли вы, что такое «шаблон»? Если да, то почему вы спрашиваете, если нет, идите и узнаете об этом. – Walter

+0

Чем больше пользы, чем общего назначения/не нужно писать перегрузки самостоятельно, вам нужно? – NathanOliver

+0

@Walter Я знаю 'template', но хочу понять его преимущество, кроме как быть более общим, не указывая тип' T'. – wenduowang

ответ

0

Одним из основных моментов C++ является generic programming и template s - способ сделать это.

Преимущество довольно очевидно: вам не нужно писать один и тот же/подобный фрагмент кода более одного раза, и вам не нужно отлаживать и поддерживать похожие фрагменты кода, но только один. (Все это относится к вашей категории «общего назначения», поэтому для этого нет преимущества).

На самом деле существует некоторый недостаток, поскольку template не является функцией (или классом). Функция (или класс) будет создана только из template во время компиляции, когда она фактически используется, тогда как ваша (не шаблонная) функция может быть предварительно скомпилирована. Это имеет два значения: (1) больше компиляции и (2), что некоторые синтаксические ошибки в коде появляются только тогда, когда template используется с аргументами, для которых они не будут работать. template в вашем сообщении, например, не будет компилироваться, если ostream << T не был определен.

+0

Есть ли недостаток в такой гибкости, или он приходит с той же стоимостью, что и определение функции с узким диапазоном? – wenduowang

+0

@wenduowang см. Мой обновленный ответ. – Walter

+0

Спасибо! Это ясно. – wenduowang

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

  • Нет связанных вопросов^_^