Основою концепції шаблонів функції є представлення використовуваного функцією типу не у вигляді якогось специфічного типу, наприклад, int, а за допомогою назви, замість якої може бути представлений довільний тип. В програмі 24.1 таким прикладом є Т. Ключове слово template сповіщає компілятор про те, що визначається шаблон функції. Ключове слово <class> може бути замінене на type. Оскільки типи користувача можна визначати за допомогою класів, різниця між типами і класами незначна. Змінна після слова class (в нашому випадку T), називається аргументом шаблону. Всередині всього визначення шаблону будь-який конкретний тип даних, такий як int, заміняє тип Т. В попередній програмі Т зустрічається 2 рази: в якості типу аргументу і типу функції. В складніших випадках воно може зустрічатися частніше, в тому числі в тілі функції.
Дії компілятора
Побачивши ключове слово template і визначення функції після нього, компілятор не виконує практично ніяких дій. Шаблон сам по собі не викликає генерації компілятором якогось коду і не може цього зробити, оскільки не знає, з яким типом даних працюватиме функція. Реальна генерація відбувається в ході виконання програми при виклику функції. Це називається реалізацією шаблону функції, при цьому кожен реалізований шаблон функції називається шаблонною функцією.
Зауважимо, що об’єм використовуваної оперативної пам’яті при цьому не зменшується: як було три функції abs, так і залишилось. Натомість істотно спрощується лістинг і спрощується задача внесення змін в програму.
Компілятор приймає рішення про те, як компілювати функцію, виходячи тільки з типу даних, використовуваних у шаблоні аргумента. Тип даних, якиі повертає функція, при цьому неістотний. Це дещо нагадує те, як компілятор вирішує, котру з перезавантажених функцій вибрати.
Як вже зрозуміло, шаблон функції – це не функція, а тільки трафарет для її створення.. Це схоже на поняття класу: клас сам по собі не є нічим конкретним, це тільки база для створення багатьох схожих об’єктів.