В C ++ у вас есть возможность перегружать функции, например:
void do_something(object1 ob);
void do_something(int i);
Что ж, шаблоны позволяют вам создавать «универсальные» функции или классы, которые принимают произвольные типы.Поэтому вместо определения функции каждый раз, когда вы добавляете тип, вы можете определить его один раз и позволить компилятору «написать» все функции для вас.
template<typename T>
void do_something(T arg);
С помощью классов вы создаете варианты, основанные на различиях типов,Лучший пример, который я могу придумать, это std :: vector .. вы можете думать о нем как о контейнере / массиве / о чем угодно.Но вам нужно определить начальный тип (чтобы он знал, насколько велик каждый элемент, как копировать каждый элемент и т. Д.):
std::vector<int> vector_of_ints;
std::vector< std::string > vector_of_strings;
...
Потому что, в действительности, компилятор записываетдополнительные функции для вас во время компиляции, не должно быть никакого эффекта времени выполнения.Однако может возникнуть проблема во время выполнения, когда у вас так много шаблонного кода, что приводит к раздутию в коде, и это может привести к отсутствию кэша выполнения ... но на современном оборудовании это не должно быть проблемой.
Главный недостаток, который я вижу, заключается в том, что вы, как правило, должны помещать шаблоны в заголовочный файл, который раскрывает вашу реализацию.Я также считаю, что их сложнее отлаживать, поскольку они могут создавать довольно грязные сообщения об ошибках компилятора.