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í.

Viz také

Referenční dokumentace standardní knihovny C++