paulo1205
(usa Ubuntu)
Enviado em 17/12/2022 - 15:45h
Salve, SamL.
Fechou o tópico no mesmo dia? Pra que tanta pressa, especialmente em dezembro, que é um mês em que todo mundo está numa correria para entregar todas as metas, participar de todas as confraternizações, fazer todas as compras, e participar dos eventos de tempo do Advento?
Brincadeira. Ou melhor, parcialmente brincadeira: apesar de estar respondendo com uma semana de atraso — e é óbvio que ninguém precisaria de esperar tanto tempo por uma resposta —, eu comecei a escrever a resposta logo no dia seguinte à sua pergunta, mas não consegui concluí-la por causa do monte de coisas para fazer, ou por estar esgotado após fazer uma parte delas — até porque tal resposta não é só o que está no texto desta mensagem aqui, mas um bocado de tempo escrevendo códigos de teste e lendo documentação para auxiliar numa eventual resposta.
O lance de
std::function é generalizar a ideia de ponteiros de função que possam ser usados como
callbacks, a fim de permitir o uso de outras construções sintáticas que porventura sejam mais flexíveis. No caso do C++, essas estrutura incluem, além de funções, também objetos-funções (
functors, que são objetos de classes que possuem funções-membros com sobrecarga do operador
(), de invocação de função) e funções lambda (que são casos particulares, numa sintaxe supostamente mais simples, de
functors anônimos, declarados
in-place), e é particularmente mais interessante quando usada com
templates.
Você pode dar um exemplo do código que você tentou fazer usando
std::function e que deu problema? Eu vi que você falou em ter algo parecido com um vetor de
callbacks, e fiquei aqui matutando se teria alguma coisa a ver com uma possível invalidação de ponteiros entre o tempo da atribuição do objeto de
callback (seja ele função,
functor, lambda conhecido ou lambda anônimo) e seu uso, mas eu
não consegui, mesmo tentando deliberadamente, criar um caso de uso em que tal invalidação acontecesse.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)