-1

To my best knowledge: void (A::*p)() = &A::test_func; means that p is a pointer to the member function void A::test_func(), and std::mem_fn(...) can be used to wrap a pointer to a member function.

But in the following code snippet I couldn't translate what void (Handler::*)() and Handler::*member_fn mean.

class Handler;

std::pair<boost::shared_ptr<Handler>, void (Handler::*)()> cb = job_queue.sync_pop();

void (Handler::*member_fn)() = cb.second;
(cb.first.get()->*member_fn)();
duong_dajgja
  • 4,196
  • 1
  • 38
  • 65

2 Answers2

1
class Handler;

std::pair<                     // a pair consisting of first and second
   boost::shared_ptr<Handler>, // first  - a shared pointer to Handler object
   void (Handler::*)()>        // second - a pointer to the member function of Handler class
cb = job_queue.sync_pop();     // sync_pop() returns such pair, stores it in cb variable

// varaible "member_fn" stores pointer to a member function from the pair
void (Handler::*member_fn)() = cb.second; 

// cb.first.get()->  - dereference pointer to Handler object, say handlerObj
// *member_fn        - dereference the pointer to member function
// (cb.first.get()->.*member_fn())()  - invoke the function stored in member_fn variable
//                                      on handlerObj (just like handlerObj.member_fn();)
(cb.first.get()->*member_fn)();

This would be way more readable:

auto pair = job_queue.sync_pop();
auto function = std::bind(pair.second, pair.first.get());
function();
WindyFields
  • 2,697
  • 1
  • 18
  • 21
1

It means exactly what you have described in the first paragraph:

// cb contains a shared pointer to an instance of Handler and a member function of Hander
std::pair<boost::shared_ptr<Handler>, void (Handler::*)()> cb = job_queue.sync_pop(); 

// assign the member function stored in cb.second to a local variable    
void (Handler::*member_fn)() = cb.second; 

(cb.first.get()->*member_fn)(); // call the function stored in member_fn on 
                                // the object held by cb.first

If this wasn't clean enough you can find a minimal example using standard library classes HERE, which does the same thing

muXXmit2X
  • 2,745
  • 3
  • 17
  • 34