Na przykład możesz przekazać przy pomocy takiego wskaźnika funkcję do innej funkcji jako argument. Wyobraź sobie, że chcesz, żeby funkcja przyjmowała tablicę, w której znajdzie wartość najmniejszą według podanego kryterium, a kryterium to może się zmieniać. Możesz wtedy przekazać do tej funkcji funkcję, która porówna dwa elementy w jakiś szczególny sposób.
Na podobnej zasadzie działa funkcja sortująca z <algorithm>. Przyjmuje iteratory kontenera standardowego oraz funkcję, która definuje relację mniejszy-większy dla dwóch elementów danego typu. Pozwala to posortować na przykład wektor obiektów naszego własnego typu. Jeżeli na przykład miałbyś klasę samochód i chciał użyć std::sort'a do posortowania zbioru obiektów klasy samochód wg roku produkcji, to mógłbyś przekazać jako argument funkcję porównującą wspomniany rok. Jeżeli chciałbyś posortować je wg pojemności silnika - proszę bardzo, wystarczy podać do std::sort'a inną funkcję. Zauważ, że takie podejście pozwala zaimplementować funkcję sortującą raz, a kryterium oceny możemy zmieniać dowolnie.
#include <algorithm>
#include <vector>
#include <iostream>
class Car
{
size_t year;
float engineCapacity;
public:
Car(size_t y, float ec):year(y), engineCapacity(ec){}
size_t getYear()
{
return year;
}
float getEngineCapacity()
{
return engineCapacity;
}
};
bool compareYear(Car first, Car second)
{
return first.getYear() < second.getYear();
}
bool compareEngineCapacity(Car first, Car second)
{
return first.getEngineCapacity() < second.getEngineCapacity();
}
int main()
{
std::vector<Car> garage;
garage.push_back(Car(1956, 1.6));
garage.push_back(Car(1972, 1.8));
garage.push_back(Car(2007, 1.4));
std::sort(garage.begin(), garage.end(), compareEngineCapacity);
for(Car car: garage)
std::cout << car.getEngineCapacity() << std::endl;
std::sort(garage.begin(), garage.end(), compareYear);
for(Car car: garage)
std::cout << car.getYear() << std::endl;
return 0;
}
Pisanie takich krótki funkcji może być czasami męczące, więc warto używać funkcji lamda, którymi polecam się zainteresować, ale to już bardziej skomplikowana konstrukcja języka C++. Co ciekawe, jako funkcję porównującą można przekazać też obiekt, który ma odpowiednio zdefiniowaną funkcję operator(), jest to tak zwany obiekt funkcyjny.