Armazenando ponteiros de função de membro em objetos genéricos std::function
Ao tentar armazenar ponteiros de função de membro de uma classe específica em um mapa usando objetos std::function, os desenvolvedores podem encontrar um erro: "o termo não é avaliado como uma função que recebe 0 argumentos." Este erro surge ao atribuir o ponteiro de função de membro diretamente ao objeto std::function.
O cerne do problema reside no fato de que funções de membro não estáticas requerem um ponteiro "este" implícito como o primeiro argumento . Para corrigir isso, o primeiro argumento deve ser explicitamente vinculado.
Solução:
std::functionf = std::bind(&Foo::doSomething, this);
Esta abordagem vincula efetivamente o ponteiro "this" como o primeiro argumento, permitindo que o objeto std::function capture corretamente o membro function.
Tratamento de funções com parâmetros:
Para funções de membro com parâmetros, espaços reservados devem ser especificados para indicar a posição dos argumentos vinculados.
using namespace std::placeholders; std::functionf = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
C 11 Lambda Sintaxe:
Se o compilador suportar lambdas C 11, uma abordagem mais concisa pode ser utilizada:
std::functionf = [=](int a, int b) { this->doSomethingArgs(a, b); };
Seguindo essas técnicas, os desenvolvedores podem efetivamente armazenar e invocar ponteiros de função de membro usando objetos std::function genéricos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3