Funktorow sie uzywa (uzywalo glownie) dlatego, ze mozna przekazac dodatkowy 'stan' do funkcji, nie za posrednictwem argumentow (a sygnatura najczesciej jest wymagana przez funkcje do ktorej przekazujemy funktor).
Na przyklad majac taka funkcje:
template<typename T, typename Predicate>
vector<T> filter(vector<T> src, Predicate p) {
vector<T> res;
for(auto const& elem : src) if(p(elem)) res.push_back(elem);
return res;
}
Potrzebujemy przekazac predykat przyjmujacy jeden argument. Zakladajac na chwile, ze nie mamy lambd, w przypadku takiego vectora:
vector<int> v { 1, 2, 3 };
i checi pobrania wszystkich wartosci wiekszych od N, musielibysmy trzymac jakis rodzaj globalnej zmiennej przechowujacej to N.
Zamiast tego mozemy sobie zdefiniowac funktor
struct GreaterThan {
GreaterThan(int n): n(n) {;}
bool operator()(int elem) {
return elem > n;
}
private:
int n;
};
W C++11 doszly lambdy, wiec i potrzeba na funktory zmalaly, ale wciaz sa wykorzystywane w ten sposob, jesli cialo funkcji jest duze/funkcja ma byc czesto wykorzystywana, lub jest rodzajem api udostepnianego przez jakas biblioteke.
Edit: Ah, jeszcze mozna uzywac funkcji pokroju bind
, ale one sa mniej elastyczne od funktorow (np. pojedyncza funkcja nie ma jak zhermetyzowac funkcji pomocniczych).