Partilhar via


Objetos de função na biblioteca padrão do C++

Um objeto de função, ou functor, é qualquer tipo que implementa operator(). Este operador é referido como o operador de chamada ou, por vezes, o operador de aplicação. A biblioteca padrão do C++ usa objetos de função principalmente como critérios de classificação para contêineres e 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 estado. O segundo é 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 main função mostra como você chama o objeto de função. Esta chamada parece uma chamada para uma função, mas na verdade é chamada operator() do LessThanFunctor tipo. Essa semelhança entre chamar um objeto de função e uma função é como o termo objeto de função surgiu.

Objetos e recipientes de função

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

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

O segundo argumento de modelo é o objeto lessde função . Este 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 maneira 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.

Objetos de função e algoritmos

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

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 booleano (um predicado). Se o resultado do objeto de função for true, então o elemento é deslocado de tal forma que está além da nova extremidade retornada por remove_if. Você pode usar qualquer um dos objetos de função declarados no <functional> cabeçalho para o argumento pred ou pode criar o seu próprio.

Ver também

Referência da Biblioteca Padrão C++