это, очевидно, реализовано с помощью шаблона класса для всей функции
Небольшое отступление для правильной терминологии: std::transform
- это функция шаблон , а не функция. Что еще более важно, в декларации стиля
template<class InputIterator, class OutputIterator, class Functor>
OutputIterator
transform(InputIterator begin, InputIterator end, OutputIterator out, Functor f);
параметры шаблона InputIterator
, OutputIterator
и Functor
не обязательно должны быть типами классов. Рассмотрим этот пример:
// function declaration
int increment(int);
int array[] = { 0, 1, 2, 3, 4 };
transform(std::begin(array), std::end(array), std::begin(array), increment);
Тогда InputIterator
и OutputIterator
выводятся как int*
, а Functor
- это int(*)(int)
, , ни один из которых не является типом класса - гораздо меньше шаблонного класса, но я отвлекся. И на самом деле, transform
может быть также объявлено
template<typename InputIterator, typename OutputIterator, typename Functor>
OutputIterator
transform(InputIterator begin, InputIterator end, OutputIterator out, Functor f);
где ключевое слово typename
немного более понятно о природе параметров шаблона: они являются типами любой природы.