Question

I want to pass an function as argument. I know you can pass a function pointer like the first test in my example, but is it possible to pass a hold function (not a pointer) like my second test?

#include <iostream>

using namespace std;


/* variable for function pointer */
void (*func)(int);

/* default output function */
void my_default(int x) {
    cout << "x =" << "\t" << x << endl << endl;
}


/* entry */
int main() {
    cout << "Test Programm\n\n";

    /* 1. Test - default output function */
    cout << "my_default\n";
    func = &my_default;   // WORK! OK!
    func(5);

    /* 2. Test - special output function 2 */
    cout << "my_func2\n";
    func =  void my_func1(int x) {
            cout << "x =" << "  " << x << endl << endl;
        };   // WON'T WORK! FAILED!
    func(5);

    return 0;
}
Was it helpful?

Solution

In C++ 11, you can pass a lambda:

func = [](int x) {  cout << "x =" << "  " << x << endl << endl; };

EDIT: lambdas can return values:

func = [](int x)->int{  cout << "x =" << "  " << x << endl << endl; return x; };

OTHER TIPS

With c++11, you can write such code in a lot simpler way:

Instead of writing function signature use auto

auto func = &my_default;   // WORK! OK!
func(5);

you can also use std::function objects to pass them around:

template<typename T>
void callme(std::function<T> f) {
   f(6);
}
std::function<decltype(my_default)> func1 = &my_default;
func(5);
callme(func1);

and also you can use lambdas:

/* 2. Test - special output function 2 */
cout << "my_func2\n";
auto fun = [](int x) {
        cout << "x =" << "  " << x << endl << endl;
    };  
fun(5);

Even with return value it work:

#include <iostream>

using namespace std;


/* variable for function pointer */
int (*func)(int);

/* default output function */
int my_default(int x) {
    //cout << "x =" << "\t" << x << endl << endl;
    return x;
}


/* entry */
int main() {
    cout << "Test Programm\n\n";

    /* 1. Test - default output function */
    cout << "my_default\n";
    func = &my_default;   // WORK! OK!
    cout << func(5) << endl << endl;

    /* 2. Test - special output function 2 */
    cout << "my_func2\n";
    func =  [](int x) {
            //cout << "x =" << "  " << x << endl << endl;
            return x;
        };
    cout << func(5) << endl << endl;

    return 0;
}

You can uses lamdas:

  std::function<int(int)> func2 = [](int i) { return i+4; };
  std::cout << "func2: " << func2(6) << '\n'; 

if the body consists of the single return statement, the return type is the type of the returned expression (after rvalue-to-lvalue, array-to-pointer, or function-to-pointer implicit conversion)

If you lamda constains not single return statamen you should specify return type

 std::function<int(int)> func2 = [=](int i) ->int {
                                                   if (globalVar)
                                                     return i*4;
                                                   else 
                                                     return 4;
                                                  };
 std::cout << "func2: " << func2(6) << '\n'; 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top