Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
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 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 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 função main
mostra como chamar o objeto de função. Essa chamada parece uma chamada para uma função, mas na verdade está chamando operator()
o LessThanFunctor
tipo. É 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 Compare = std::less<Key>,
class Allocator = std::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 de objetos de função está em algoritmos. Por exemplo, o algoritmo remove_if
é declarado da seguinte maneira:
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 booliano (um predicado). Se o resultado do objeto de função for true
, o elemento será deslocado de modo que ele esteja além do novo final retornado por remove_if
. É 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.