
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
quadradosem precisar informar os parâmetros, nesse caso ela recebe umintdentro dos parênteses e retorna umintdentro 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.