Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Obiekt funkcji lub functor to dowolny typ, który implementuje operator()
element . Ten operator jest określany jako operator wywołania lub czasami operator aplikacji. Standardowa biblioteka języka C++ używa obiektów funkcji głównie jako kryteriów sortowania kontenerów i algorytmów.
Obiekty funkcji zapewniają dwie główne zalety w stosunku do zwykłego wywołania funkcji. Pierwszy polega na tym, że obiekt funkcji może zawierać stan. Drugim jest to, że obiekt funkcji jest typem i dlatego może być używany jako parametr szablonu.
Tworzenie obiektu funkcji
Aby utworzyć obiekt funkcji, utwórz typ i zaimplementuj operator()
element , na przykład:
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);
}
Ostatni wiersz main
funkcji pokazuje sposób wywoływania obiektu funkcji. To wywołanie wygląda jak wywołanie funkcji, ale faktycznie wywołuje operator()
typ LessThanFunctor
. Podobieństwo między wywoływaniem obiektu funkcji a funkcją polega na tym, jak pojawił się obiekt funkcji terminu.
Obiekty funkcji i kontenery
Standardowa biblioteka języka C++ zawiera kilka obiektów funkcji w pliku nagłówka <functional>
. Jednym z tych obiektów funkcji jest kryterium sortowania dla kontenerów. Na przykład set
kontener jest zadeklarowany w następujący sposób:
template <class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>>
class set;
Drugim argumentem szablonu jest obiekt less
funkcji . Ten obiekt funkcji zwraca true
wartość, jeśli pierwszy parametr jest mniejszy niż drugi parametr. Ponieważ niektóre kontenery sortują swoje elementy, kontener potrzebuje sposobu porównywania dwóch elementów. Porównanie odbywa się przy użyciu obiektu funkcji. Możesz zdefiniować własne kryteria sortowania dla kontenerów, tworząc obiekt funkcji i określając go na liście szablonów dla kontenera.
Obiekty i algorytmy funkcji
Innym zastosowaniem obiektów funkcji jest algorytmy. Na przykład remove_if
algorytm jest zadeklarowany w następujący sposób:
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
Ostatnim argumentem remove_if
jest obiekt funkcji, który zwraca wartość logiczną ( predykat). Jeśli wynikiem obiektu funkcji jest true
, element jest przesunięty tak, że znajduje się poza nowym końcem zwracanym przez remove_if
element . Możesz użyć dowolnych obiektów funkcji zadeklarowanych w nagłówku <functional>
argumentu pred
lub utworzyć własne.