Compartilhar via


Objetos de função na Biblioteca Padrão C++

Um objeto de função, ou functor, é qualquer tipo que implementa operator(). Esse operador é conhecido como operador de chamada ou, às vezes, operador de aplicativo. A Biblioteca Padrão C++ usa objetos de função principalmente como critérios de classificação para contêineres e em algoritmos.

Os objetos de função fornecem duas vantagens principais em relação a uma chamada de função regular. A primeira é que um objeto de função pode conter o estado. A segunda é que um objeto de função é um tipo e, portanto, pode ser usado como um parâmetro de modelo.

Criando um objeto de função

Para criar um objeto de função, crie um tipo e implemente operator(), como:

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);
}

A última linha da função main mostra como chamar o objeto de função. Essa chamada parece uma chamada para uma função, mas na verdade está chamando operator() o LessThanFunctor tipo. É dessa semelhança entre chamar um objeto de função e uma função que surgiu o termo objeto de função.

Contêineres e objetos de função

A Biblioteca C++ Standard contém vários objetos de função no arquivo de cabeçalho <functional>. Um uso desses objetos de função é como critério de classificação para contêineres. Por exemplo, o contêiner set é declarado da seguinte maneira:

template <class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>>
class set;

O segundo argumento de modelo é o objeto de função less. Esse objeto de função retorna true se o primeiro parâmetro for menor que o segundo parâmetro. Como alguns contêineres classificam seus elementos, o contêiner precisa de uma forma de comparar dois elementos. A comparação é feita usando o objeto de função. Você pode definir seus próprios critérios de classificação para contêineres criando um objeto de função e especificando-o na lista de modelos para o contêiner.

Algoritmos e objetos de função

Outro uso de objetos de função está em algoritmos. Por exemplo, o algoritmo remove_if é declarado da seguinte maneira:

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

O último argumento para remove_if é um objeto de função que retorna um valor booliano (um predicado). Se o resultado do objeto de função for true, o elemento será deslocado de modo que ele esteja além do novo final retornado por remove_if. É possível usar qualquer um dos objetos de função declarados no cabeçalho <functional> para o argumento pred ou criar seus próprios objetos.

Confira também

Referência da biblioteca padrão C++