How to pass a function in a class as a parameter to another function in the same class in C ++ 11?

The following minimalist codes are used to illustrate my question. These codes do not compile. How to use a lambda expression or std::bindpass a member of a function as a parameter? Many thanks for your help.

#include <iostream>

using namespace std;
class ABC{
private:
    int x =3;
    int add2num(int a, int b){
        return a+b+x;
    }

    int worker(int &fun(int a, int b), int a, int b){
        return fun(a,b);
    }
public:
    int doSomething(int a, int b){
        return worker(add2num, a, b);
    }
};

int main() {
    ABC test;
    cout << test.doSomething(3,5) << endl;
    return 0;
}
+4
source share
5 answers

You can achieve your goal without lambda or std::bindas follows:

#include <iostream>

using namespace std;
class ABC{
private:
    int x =3;
    int add2num(int a, int b){
        return a+b+x;
    }

    int worker(int (ABC::*fun)(int a, int b), int a, int b){
        return (this->*fun)(a,b);
    }
public:
    int doSomething(int a, int b){
        return worker(&ABC::add2num, a, b);
    }
};

int main() {
    ABC test;
    cout << test.doSomething(3,5) << endl;
    return 0;
}

Compare this code with yours to see the differences.

Here you can learn more about member pointers, etc.

+4
source

Using lambdas and templates:

#include <iostream>
#include <functional>

using namespace std;
class ABC{
private:
    int x =3;
    int add2num(int a, int b){
        return a+b+x;
    }

   template<class functor_t>
   int worker(const functor_t& fun, int a, int b){
       return fun(a,b);
   }

public:
   int doSomething(int a, int b) {
     return worker([this](int a, int b){ return add2num(a, b); }, a, b);
   }

};

int main() {
    ABC test;
    cout << test.doSomething(3,5) << endl;
    return 0;
}

Or, without lambdas, but using std::bind:

   int doSomething(int a, int b) {
     namespace ph = std::placeholders;

     return worker(std::bind(&ABC::add2num, this, ph::_1, ph::_2), a, b);
   }

, worker , , .

+4

, std:: bind std:: function (++ 11):

#include <iostream>
#include <functional>
using namespace std::placeholders;

class ABC
{
private:
    int x = 3;

    int add2num(int a, int b)
    {
        return a+b+x;
    }

    int worker(std::function<int(int, int)> fun, int a, int b)
    {
        return fun(a, b);
    }

public:
    int doSomething(int a, int b)
    {
        return worker(std::bind(&ABC::add2num, this, _1, _2), a, b);
    }
};

int main()
{
    ABC test;
    std::cout << test.doSomething(3,5) << std::endl;
    return 0;
}

Ideone.

: 11

+2

paweldac, .

'this' (. http://en.cppreference.com/w/cpp/language/lambda):

int doSomething(int a, int b)
{
    auto func = [this](int a, int b) -> int { return add2num(a,b); };
    return worker(func, a, b);
}

, , doSomething. , func .

+2
source

Adapted code snippet for using lambda functions

#include <iostream>
#include <functional>

using namespace std;
class ABC{
private:
    int x =3;
    int add2num(int a, int b){
        return a+b+x;
    }

   int worker(std::function<int(int, int)> fun, int a, int b){
       return fun(a,b);
   }
public:
   int doSomething(int a, int b){
     auto func = [&](int a, int b) -> int { return add2num(a,b); };
     return worker(func, a, b);
   }
};

int main() {
    ABC test;
    cout << test.doSomething(3,5) << endl;
    return 0;
}

Here is the perfect version: https://ideone.com/cupxaB

+1
source

Source: https://habr.com/ru/post/1665098/


All Articles