Sdílet prostřednictvím


Objekty funkcí ve standardní knihovně C++

Objekt funkce nebo functor je jakýkoli typ, který implementuje operator(). 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 funkcí poskytují dvě hlavní výhody oproti běžné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 operator(), například:

class LessThanFunctor
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(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á operator()LessThanFunctor typ. 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 Compare = std::less<Key>,
    class Allocator = std::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í objektů funkcí je v algoritmech. Například algoritmus remove_if je deklarován takto:

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate pred);

Posledním argumentem remove_if je objekt funkce, který vrací logickou hodnotu ( predikát). Pokud je truevýsledek objektu funkce , je prvek posunut tak, aby byl mimo nový konec vrácen .remove_if 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