O modelo de classe std::function
é um wrapper de função polimórfica de uso geral. Instâncias de std::function
podem armazenar, copiar e invocar qualquer destino: expressões lambda , expressões de ligação ou outros objetos de função, bem como ponteiros para funções de membro e ponteiros para membros de dados.
std::function
é um tipo de objeto de eliminação. Isso significa que ele apaga os detalhes de como algumas operações acontecem e fornece uma interface de tempo de execução uniforme para elas.
Para usar std::function
é necessário incluir o cabeçalho: <functional>
.
O uso mais básico seria o exemplo abaixo:
Nesse caso ela armazena a função
quadrado
sem precisar informar os parâmetros, nesse caso ela recebe umint
dentro dos parênteses e retorna umint
dentro doscolchetes angulares
.
#include <iostream>
#include <functional>
int quadrado(int x){
return x * x;
}
int main(){
std::function<int(int)> fn = quadrado;
std::cout << fn(3) << '\n';
}
Nesse caso ela armazena dois int
e retorna um double
:
#include <iostream>
#include <functional>
int soma(int x, int y){
return x + y;
}
int main(){
std::function<double(int, int)> fn = soma;
std::cout << fn(6, 9) << '\n';
}
Similar ao acima, mas agora ela é um ponteiro de função para o endereço de &soma
:
#include <iostream>
#include <functional>
int soma(int x, int y){
return x + y;
}
int main(){
std::function<double(int, int)> fn = &soma;
std::cout << fn(6, 9) << '\n';
}
No cabeçalho <functional>
também está disponível std::negate
, nesse caso, usando std::negate
ela inverte o valor da saída:
#include <iostream>
#include <functional>
int main(){
std::function<int(int)> fn = std::negate<int>();
std::cout << fn(42) << '\n';
}
Saída:
-42
.
Ela também pode ser usada em conjunto com lambda, dessa forma a assinatura dela torna possível identificar a lambda:
#include <iostream>
#include <functional>
int main(){
std::function<int(int)> fn = [&](int x){
return x * 2;
};
std::cout << fn(9) << '\n';
}
Ou seja, é mais um recurso da STL que pode ser útil em diversos casos em que o desempenho é fundamental, mas o debug também. Para mais informações veja nesse link.