techbech
techbech

Reputation: 3874

Call a function defined from another function c++

I will like to know, how to make a function where I define a function. And then I can call the defined function. Let me try with a example.

void funcToCall() {
    std::cout<<"Hello World"<<std::endl;
}

void setFuncToCall(void func) {
    //Define some variable with func
}

void testFuncCall() {
    //Call function that has been defined in the setFuncToCall
}

setFuncToCall(funcToCall()); //Set function to call
testFuncCall(); //Call the function that has been defined

I Hope that you understand what I am trying to do here. But I don't know how to bring It down to the right code :-)

Upvotes: 1

Views: 239

Answers (3)

Alex
Alex

Reputation: 7858

You need a function pointer. It's easier to work with function pointers if you typedef them first.

typedef void (*FuncToCallType)();

FuncToCallType globalFunction; // a variable that points to a function

void setFuncToCall(FuncToCallType func) {
    globalFunction = func;
}

void testFuncCall() {
    globalFunction();
}

setFuncToCall( funcToCall ); //Set function to call,NOTE: no parentheses - just the name 
testFuncCall(); //Call the function that has been defined

As other answers have suggested you can use objects like functions, too. But this requires operator overloading (even if it remains hidden from you) and is typically used with templates. It gives more flexibility (you can set some state to the object before passing it to the function and the object's operator() can use that state) but in your case function pointers may be just as good.

Upvotes: 4

Dmytro Sirenko
Dmytro Sirenko

Reputation: 5083

C syntax for function pointers is a bit weird, but here we go:

// this is a global variable to hold a function pointer of type: void (*)(void)
static void (*funcp)(void); 
// you can typedef it like this:
//typedef void (*func_t)(void); 
// - now `func_t` is a type of a pointer to a function void -> void

// here `func` is the name of the argument of type `func_t` 
void setFuncToCall(void (*func)(void)) { 
// or just: void setFuncToCall(func_t func) {
    //Define some variable with func
    ...
    funcp = func;
}

void testFuncCall(void) {
    //Call function that has been defined in the setFuncToCall
    funcp();
}

setFuncToCall(funcToCall);  // without () !
testFuncCall();

Upvotes: 2

lucasg
lucasg

Reputation: 11012

What you want to use is a callback, and is has been answered her : Callback functions in c++

I would advise you to use std::tr1::function ( generalized callback )

Upvotes: 2

Related Questions