Partilhar via


Objetos de função

A o objeto de função, ou functor, é qualquer tipo que implementa operator().Este operador é conhecido como o chamar o operador ou, às vezes, o o operador de aplicativo.A Standard Template Library usa objetos de função principalmente como critérios para os recipientes e em algoritmos de classificação.

Objetos de função fornecem duas vantagens principais ao longo de uma chamada de função reta.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, um tipo de criar e implementar operator(), tais 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 main função mostra como você pode chamar o objeto de função.Essa chamada é semelhante a uma chamada para uma função, mas na verdade está chamando operator() do tipo Functor.Essa semelhança entre um objeto de função e uma função de chamada é como surgiu o termo objeto de função.

Recipientes e objetos de função

A Standard Template Library contém vários objetos de função na <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 set contêiner é declarada 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.Este objeto de função retorna true se o primeiro parâmetro passado para ele é menor do que o segundo parâmetro passado.Como alguns recipientes classificar seus elementos, o recipiente precisa de uma forma de comparar dois elementos e isso é realizado usando o objeto de função.Você pode definir seus próprios critérios para contêineres de classificação criando um objeto de função e especificando-o na lista de modelos para o recipiente.

Algoritmos e objetos de função

Outro uso de objetos funcionais é em algoritmos.Por exemplo, o remove_if algoritmo é 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 booleano (um predicado).Se o resultado do objeto de função true, e em seguida, o elemento é removido do recipiente que está sendo acessado pelos iteradores _First e _Last.Você pode usar qualquer um dos objetos de função declarados na <functional> cabeçalho para o argumento _Pred ou você pode criar seus próprios.

Consulte também

Referência

Standard Template Library