domingo, 20 de março de 2011

Dicas de Programação: Como passar uma função como parametro em C++

Essa é meio complicada, mas dá para passar uma função como parametro em C++. Primeiramente, a gente declara a função que vou passar para a outra:

#include <stdio.h>

void println(const char *str) {
printf("%s\n",str);
}

Agora vamos criar a função que recebe a anterior como parametro:

void alo_mundo(void (func)(const char *str) ) {
func("Alo mundo");
}

Vendo a função acima, a gente percebe que o parametro passado tem a seguinte estrutura:

void -> o tipo do retorno da função passada
(func) -> o nome da função (variável)
(const char *str) -> o argumento da função passada

Ou seja, quando você passa uma função, você precisa saber a estrutura do cabeçalho dela (o retorno e os parametros). Existe um jeito de deixar genérico, mas isso vai para uma outra dica. :P

Com isso, a gente pode executar a função assim:

int main(int num_args, char** args) {
alo_mundo(println);
}

Em Javascript também dá para passar uma função como argumento, só que de um jeito bem mais fácil:

//Função que será passada como argumento
var println = function(str) {
document.write(str + "\n");
}

//Função que recebe outra função como argumento
var alo_mundo = function(func) {
func("Alo mundo");
}

//Executa a função
alo_mundo(println);

Coisa de doido não? :P

Até o próximo post!

2 comentários:

Anônimo disse...

Você disse que existe um forma de deixar genérica, pode indicar o link onde eu encontro?

Takemura disse...

Um jeito que eu sei, é usando argumentos variáveis com ponteiros de "void":
http://stackoverflow.com/questions/2457498/generic-function-pointers-in-c
Mas, pelo que vi, também dá para usar template:
http://stackoverflow.com/questions/9779105/generic-member-function-pointer-as-a-template-parameter