Callback: ponteiro de função como argumento e passando um argumento adicional [duplicado]

Oct 04 2020

Como passar um ponteiro de função como argumento com um argumento?

void A(){
    std::cout << "hello" << endl;
}

void B(void (*ptr)()){ // function pointer as agrument
    ptr(); // call back function "ptr" points.
}

void C(string name){
    std::cout << "hello" << name << endl;
}

void D(void (*ptr2)(string name)){ // function pointer as agrument
    ptr2(name); // error 1
}

int main(){
    void (*p)() = A; // all good
    B(p); // is callback // all good

    void (*q)(string name) = C;
    D(q)("John Doe"); // error 2
    return 0;
};

erros:
1 - uso de identificador não declarado 'nome'
2 - tipo de objeto chamado 'void' não é uma função ou ponteiro de função

Respostas

4 songyuanyao Oct 04 2020 at 13:08

Você deve Dtomar dois parâmetros, um para o ponteiro de função, outro para o argumento a ser passado para o ponteiro de função. Por exemplo

void D(void (*ptr2)(string), const string& name){
    ptr2(name);
}

então chame como

D(q, "John Doe");
3 MikeCAT Oct 04 2020 at 13:08
  1. namefaz parte da declaração de tipo ptr2e não é uma variável em D.
  2. Você está tentando chamar o que é retornado D, que é void. ,é usado para separar argumentos em C ++.

Experimente isto:

#include <iostream>
#include <string>
using std::endl;
using std::string;

void A(){
    std::cout << "hello" << endl;
}

void B(void (*ptr)()){ // function pointer as agrument
    ptr(); // call back function "ptr" points.
}

void C(string name){
    std::cout << "hello" << name << endl;
}

void D(void (*ptr2)(string name), string name){ // function pointer and a string as agrument
    ptr2(name);
}

int main(){
    void (*p)() = A; // all good
    B(p); // is callback // all good

    void (*q)(string name) = C;
    D(q, "John Doe"); // pass 2 arguments
    return 0;
} // you don't need ; here