Partilhar via


Objetos de Função

Um objeto de função, ou o funtor, é qualquer tipo que implementa o operador (). Esse operador é referenciado como o operador de chamada ou às vezes o operador do aplicativo. A função padrão do usa da biblioteca de objetos de modelo primeiro como critérios de classificação para contêineres e nos algoritmos.

Os objetos de função fornecem duas principais vantagens sobre uma chamada de função direta. O primeiro é que um objeto da função pode conter o estado. A segunda é que um objeto de função é um tipo e em virtude disso pode ser usado como um parâmetro do modelo.

Criando um objeto de função

Para criar um objeto de função, crie um tipo e implementar 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 de main mostra como chamar o objeto de função. Essa chamada é semelhante a uma chamada a uma função, mas está chamando realmente operator() do tipo de Funtor. Essa similaridade entre chamar um objeto de função e uma função é como o objeto de função do termo atingir aproximadamente.

Objetos e contêineres de função

A biblioteca padrão do modelo contiver vários objetos de função no arquivo de cabeçalho de <functional> . Um uso desses objetos de função é como critério de classificação para os contêineres. Por exemplo, o contêiner de set é declarado como segue:

template <
    class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key> >
class set

O segundo argumento do modelo é o objeto lessda função. Esse objeto da função retorna true se o primeiro parâmetro transmitido a ele for menor que o segundo parâmetro passado. Desde que qualquer contêiner classificam seus elementos, o contêiner precisa de uma forma de comparar dois elementos, e isso é feito usando o objeto de função. Você pode definir seus próprios critérios de classificação para contêineres criando um objeto da função e especificando o na lista do modelo para o contêiner.

Objetos e algoritmos de função

Outro uso de objetos funcionais está nos algoritmos. Por exemplo, o algoritmo de remove_if é declarado como segue:

template<class ForwardIterator, class Predicate>
    ForwardIterator remove_if(
        ForwardIterator _First,
        ForwardIterator _Last,
        Predicate _Pred
    );

O último argumento a remove_if é um objeto da função que retorna um valor booliano ( um predicado). Se o resultado do objeto da função é true, o elemento será removido do contêiner que está sendo acessado pelos iteradores _First e _Last. Você pode usar qualquer um dos objetos de função declarados no cabeçalho de <functional> para o argumento _Pred ou você pode criar seus próprios.

Consulte também

Referência

Biblioteca de Modelos Padrão