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.