Objekty funkcí ve standardní knihovně C++
Objekt funkce nebo functor je jakýkoli typ, který implementuje operátor(). Tento operátor se označuje jako operátor volání nebo někdy operátor aplikace. Standardní knihovna jazyka C++ používá objekty funkcí primárně jako kritéria řazení kontejnerů a algoritmů.
Objekty funkce poskytují dvě hlavní výhody oproti přímému volání funkce. První je, že objekt funkce může obsahovat stav. Druhým je, že objekt funkce je typ, a proto je možné jej použít jako parametr šablony.
Vytvoření objektu funkce
Pokud chcete vytvořit objekt funkce, vytvořte typ a implementujte operátor(), 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 voláte objekt funkce. Toto volání vypadá jako volání funkce, ale ve skutečnosti volá operátor() typu Functor. Podobnost mezi voláním objektu funkce a funkce je způsob, jakým objekt funkce vznikl.
Objekty a kontejnery funkcí
Standardní knihovna C++ obsahuje v <functional>
souboru hlavičky několik objektů funkce. Jedním z použití těchto objektů funkcí je jako kritérium řazení kontejnerů. Kontejner je například set
deklarován takto:
template <class Key,
class Traits=less<Key>,
class Allocator=allocator<Key>>
class set
Druhým argumentem šablony je objekt less
funkce . Tento objekt funkce vrátí true
, pokud je první parametr menší než druhý parametr. Vzhledem k tomu, že některé kontejnery seřadí jejich prvky, potřebuje kontejner způsob porovnání dvou prvků. Porovnání se provádí pomocí objektu funkce. Vlastní kritéria řazení kontejnerů můžete definovat tak, že vytvoříte objekt funkce a zadáte ho v seznamu šablon kontejneru.
Objekty a algoritmy funkcí
Další použití funkčních objektů je v algoritmech. Například algoritmus remove_if
je deklarován takto:
template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
Predicate pred);
Posledním argumentem remove_if
je objekt funkce, který vrací logickou hodnotu ( predikát). Pokud je true
výsledek objektu funkce , je prvek odebrán z kontejneru, ke který přistupuje iterátory first
a last
. Můžete použít libovolný z objektů funkcí deklarovaných v <functional>
záhlaví argumentu pred
nebo můžete vytvořit vlastní.