Шаблоны функций создаются с использованием ключевого слова template.
После него в угловых скобках идёт список типов -- параметров шаблона.
Использовать этот шаблон можно для разных типов, причём для каждого типа будет создана своя специализация шаблона. Мы можем это заметить по значению статической переменной, которая отслеживает сколько раз вызвана функция -- для каждой специализации это количество отслеживается отдельно.
Указывать с каким типом должно быть произведено инстанцирование в данном случае не нужно, т.к. этот тип используется в параметрах функции и возможно неявное инстанцирование, но можно и указать использованием угловых скобок с типом при вызове функции (после её имени, но до круглых скобок).
Данный шаблон может быть использован не только для стандратных, но и для пользовательских типов, поддерживающих использованные в нём операции (в данном случае -- сравнение с int и унарный минус).