Eu tenho a situação em que uma função chama uma das várias funções possíveis. Este parece ser um bom lugar para passar uma função como parâmetro. Nesta resposta quoara de Zubkov, existem três maneiras de fazer isso.
int g(int x(int)) { return x(1); }
int g(int (*x)(int)) { return x(1); }
int g(int (&x)(int)) { return x(1); }
...
int f(int n) { return n*2; }
g(f); // all three g's above work the same
Quando deve ser usado o método? Quais são as diferenças? Prefiro a abordagem mais simples, por que a primeira maneira nem sempre deve ser usada?
Para minha situação, a função é chamada apenas uma vez e eu gostaria de mantê-la simples. Eu tenho que trabalhar com passar pelo ponteiro e eu apenas chamo com g(myFunc)
onde myFunc
é a função que é chamada por último.
c++
function
parameter-passing
nortista
fonte
fonte
g(+f);
funciona para os dois primeiros, mas não para o terceiro.int g(int x(int))
,x
é um ponteiro, mesmo que não pareça um. A declaração global correspondenteint x(int);
declara uma função, não um ponteiro de função.x
como ponteiro.Respostas:
Expandindo o comentário de LF, geralmente é melhor evitar completamente os ponteiros de função e trabalhar em termos de objetos invocáveis (coisas que definem
operator()
). Todos os seguintes permitem que você faça isso:É importante ressaltar que tudo isso pode ser usado em funções lambda com capturas, diferente de qualquer uma das suas opções:
fonte
<algorithm>
usam essa abordagem para aceitar funções de retorno de chamada.g<int>(myFunc)
apenasg(myFunc)
?