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.

Objetos de função fornecem duas vantagens principais com relação a uma chamada de função direta. 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 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);
}

A última linha da função main mostra como chamar o objeto de função. Essa chamada é semelhante a uma chamada para uma função, mas na verdade está chamando o operator() do tipo Functor. É 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 Traits=less<Key>,
    class Allocator=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 dos objetos funcionais é em algoritmos. Por exemplo, o algoritmo remove_if é declarado da seguinte maneira:

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    Predicate 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á removido do contêiner que está sendo acessado pelos iteradores first e last. É 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++