Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í.