Objekty funkcí
A funkce objektu, nebo functor, libovolný typ, který implementuje operator().Tento operátor je označována jako volat operátor nebo někdy aplikace operátoru.Standardní knihovna šablon používá především jako kritéria pro kontejnery a algoritmy řazení funkce.
Objekty funkce poskytuje dvě hlavní výhody oproti volání funkce rovné.První je, že funkce objektu může obsahovat státu.Druhým je, že funkce objektu je typ a proto ji lze použít jako parametr šablony.
Vytváření funkce objektu
Chcete-li vytvořit objekt funkce, vytvořit typ a implementovat operator(), jako například:
class Functor
{
public:
int operator()(int a, int b)
{
return a < b;
}
};
int main()
{
Functor f;
int a = 5;
int b = 7;
int ans = f(a, b);
}
Poslední řádek main funkce ukazuje, jak volat funkce objektu.Toto volání vypadá volání funkce, ale ve skutečnosti volá operator() Functor typu.Této podobnosti mezi volání funkce objektu a funkce je jak pojem funkce objektu byl dodán.
Funkce objekty a kontejnery
Standardní knihovna šablon obsahuje několik funkcí objektů v <functional> soubor hlaviček.Jeden tyto objekty funkce slouží jako kritérium třídění pro kontejnery.Například set kontejneru je deklarována takto:
template <
class Key,
class Traits=less<Key>,
class Allocator=allocator<Key> >
class set
Druhý argument šablony je objekt funkce less.Vrátí objekt funkce true Pokud předána první parametr je menší než druhý parametr předaný.Vzhledem k tomu, že některé kontejnery řadit jejich elementy, kontejner musí být porovnávání dvou prvků a to lze provést pomocí funkce objektu.Můžete definovat vlastní kritéria pro kontejnery řazení vytvořením funkce objektu a určení v seznamu šablon pro kontejner.
Objekty funkce a algoritmy
Jiné funkční objekty slouží v algoritmech.Například remove_if algoritmus je deklarována takto:
template<class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Pred
);
Poslední argument remove_if je funkce objektu, který vrací hodnotu typu boolean ( predikát).Jestliže je výsledek funkce objektu true, pak prvek je odebrán z kontejneru, který přistupuje iterátorů _First a _Last.Můžete použít kterýkoli z funkce objekty deklarované v <functional> záhlaví pro tento argument _Pred nebo si vytvořit své vlastní.