std::function
é um tipo de apagamento do objeto.Isso significa que ele apaga os detalhes de como algumas operações de acontecer, e fornece um uniforme de tempo de execução de interface para eles.Para std::function
, o principal1 operações de copiar/mover, a destruição e a 'invocação' com operator()
-- a 'função como operador de chamada de'.
Em menos obtusos inglês, significa que std::function
pode conter quase qualquer objeto que funciona como um ponteiro de função em como você chamá-lo.
A assinatura suporta passa dentro de parênteses em ângulo: std::function<void()>
leva zero argumentos e retorna nada. std::function< double( int, int ) >
leva dois int
argumentos e retorna double
.Em geral, std::function
suporta o armazenamento de qualquer função como objeto cujos argumentos podem ser convertidos-a partir de sua lista de argumentos, e cujo valor de retorno pode ser convertido para o valor de retorno.
É importante saber que std::function
e lambdas são diferentes, se compatível, animais.
A próxima parte da linha é um lambda.Esta é uma nova sintaxe em C++11 para adicionar a capacidade de escrever de uma função simples como objetos-objetos que podem ser invocados com ()
.Tais objetos podem ser do tipo apagados e armazenados em um std::function
ao custo de alguns tempo de execução de sobrecarga.
[](){ code }
em particular, é uma verdade simples lambda.Ele corresponde a este:
struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};
um exemplo do acima simples pseudo-tipo de função.Uma classe real, como o acima é "inventado" pelo compilador, com uma implementação definido um nome exclusivo (muitas vezes incluindo símbolos que nenhum tipo definido pelo usuário pode conter) (não sei se é possível que você pode seguir o padrão sem inventar um tal de classe, mas cada compilador que eu conheço, na verdade, cria a classe).
O total lambda sintaxe se parece com:
[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}
Mas em muitas partes pode ser omitido ou deixado em branco.O capture_list corresponde tanto o construtor da resultante de tipo anônimo e suas variáveis de membro, o argument_list os argumentos da operator()
, e o tipo de retorno o tipo de retorno.O construtor do lambda instância também é magicamente chamado quando a instância é criada com o capture_list.
[ capture_list ]( argument_list ) -> return_type { code }
basicamente, torna-se
struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};
Observe que na c++20 modelo argumentos foram adicionados para lambdas, e que não foi abordado acima.
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 Além disso, ESTE é armazenado (typeid), e o elenco-de-volta-ao-original-tipo de operação está incluído.