"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como armazenar ponteiros de função de membro em objetos genéricos `std::function`?

Como armazenar ponteiros de função de membro em objetos genéricos `std::function`?

Publicado em 2024-12-21
Navegar:913

How to Store Member Function Pointers in Generic `std::function` Objects?

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::function f = 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::function f = 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::function f = [=](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.

Tutorial mais recente Mais>

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