Objekty funkce ve standardní knihovně C++
Objekt funkce, nebo funktor, je jakýkoli typ, který implementuje operátor (). Tento operátor je označován jako operátor volání nebo někdy operátorem aplikace. Standardní knihovna jazyka C++ používá objekty funkce primárně jako kritéria řazení pro kontejnery a v algoritmech.
Objekty funkce poskytují dvě hlavní výhody v rámci přímého volání funkce. První je, že objekt funkce může obsahovat stav. Druhým je, že objekt funkce je typu, a proto lze použít jako parametr šablony.
Vytvoření objektu funkce
Chcete-li 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 zavolat objekt funkce. Toto volání vypadá jako volání funkce, ale ve skutečnosti volá operátor () typu funktor. Tato podobnost mezi voláním objektu funkce a funkcí je způsob, jakým se dorazila pojem objektu funkce.
Objekty funkce a kontejnery
Standardní knihovna C++ obsahuje několik objektů funkcí v <functional> hlavičkovém souboru. Jedno použití těchto objektů funkcí je jako kritérium řazení pro kontejnery. Například set kontejner je deklarován následujícím způsobem:
template <class Key,
class Traits=less<Key>,
class Allocator=allocator<Key>>
class set
Druhý argument šablony je objekt funkce less . Tento objekt funkce vrátí true , pokud je první parametr menší než druhý parametr. Vzhledem k tomu, že některé kontejnery řadí jejich prvky, kontejner vyžaduje způsob porovnávání dvou prvků. Porovnání je provedeno pomocí objektu Function. Můžete definovat vlastní kritéria řazení pro kontejnery vytvořením objektu funkce a jeho zadáním v seznamu šablon pro kontejner.
Objekty a algoritmy funkcí
Jiné použití funkčních objektů je v algoritmech. Například remove_if algoritmus je deklarován následujícím způsobem:
template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
Predicate pred);
Poslední argument pro remove_if je objekt funkce, který vrací logickou hodnotu ( remove_if). Pokud je výsledek objektu funkce true , je prvek odebrán z kontejneru, ke kterému přistupovali iterátory first a last . Můžete použít kterýkoli z objektů Function deklarovaných v <functional> hlavičce argumentu pred nebo můžete vytvořit vlastní.