Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um objeto de função, ou functor, é qualquer tipo que implementa operator(). Este operador é referido como o operador de chamada ou, por vezes, o operador de aplicação. A biblioteca padrão do C++ usa objetos de função principalmente como critérios de classificação para contêineres e 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 estado. O segundo é 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 main função mostra como você chama o objeto de função. Esta chamada parece uma chamada para uma função, mas na verdade é chamada operator() do LessThanFunctor tipo. Essa semelhança entre chamar um objeto de função e uma função é como o termo objeto de função surgiu.
Objetos e recipientes de função
A biblioteca padrão do C++ contém vários objetos de função no <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 contêiner é declarado set da seguinte forma:
template <class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>>
class set;
O segundo argumento de modelo é o objeto lessde função . Este 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 maneira 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.
Objetos de função e algoritmos
Outro uso de objetos de função é em algoritmos. Por exemplo, o algoritmo é declarado remove_if da seguinte forma:
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 booleano (um predicado). Se o resultado do objeto de função for true, então o elemento é deslocado de tal forma que está além da nova extremidade retornada por remove_if. Você pode usar qualquer um dos objetos de função declarados no <functional> cabeçalho para o argumento pred ou pode criar o seu próprio.