Sdílet prostřednictvím


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 lessfunkce . 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 truevý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í.

Viz také

Standardní knihovna C++ – referenční dokumentace