Думайте о шаблонах как о генерации кода, сродни копированию / вставке, когда вы заменяете T
конкретным типом. «Instantiation» - это процесс копирования кода в вашу программу.
Неявное создание экземпляров происходит всякий раз, когда вы используете шаблон. Для шаблонов функций конкретный тип выводится из аргументов функции, а шаблон создается для этого типа. Итак, ваш код фактически становится:
void show(int a, int) { std::cout << "I used the int version " << a << " " << b << "\n"; }
void show(char a, char) { std::cout << "I used the int version " << a << " " << b << "\n"; }
int main() { /* as it was */ }
Явное создание экземпляров, с другой стороны, просто явно заставляет компилятор генерировать код. Например, если мы добавим явный экземпляр
template void show(double, double);
к вашему коду компилятор сгенерирует соответствующий код,
void show(double a, double) { std::cout << "I used the int version " << a << " " << b << "\n"; }
Это произойдет независимо от того, действительно ли вы используете этот код.
Если вы еще не знаете о классах, то вам не хватает 92% удовольствия, потому что создание шаблона класса гораздо более тонкое. Только функции-члены, которые фактически используются, создаются неявно, в то время как явное создание создает код для всех членов класса. Кроме того, функции-члены класса в некоторой степени не проверяются на корректность до тех пор, пока они фактически не будут созданы, поэтому вы можете писать шаблоны, которые фактически не имеют смысла для всех возможных типов.