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.