To się nazywa szablon funkcji. A działa mniej–więcej tak:
template<class inputIt, class outputIt, class func_t>
void transform(inputIt begin, inputIt end, outputIt out, func_t func) {
/* iteracja po (begin, end] */
while(begin != end) {
*out = func(*begin);
++begin;
++out;
}
}
`.begin()` (preferowane jest `std::begin(obiekt)`) zwraca iterator (coś jak obiektowy wskaźnik) na pierwszy element, `.end()` na pierwszy element za ostatnim (czyli jeśli po inkrementacji begin = end to pora skończyć pracę).
W takim razie składnia jest mniej–więcej taka: transform(początek, koniec, początek_wyjście, ::tolower);