Search code examples
c++templatesstlfunctorboost-bind

Am I reinventing the wheel with this trivial method call forwarding class?


I just found myself creating a class

template <typename T> struct invoker {
  void operator()(T& it) const {it();}
};

so I could pass an invoker<foo> to something (which isn't under my control) which wants to call invoker<foo>::operator()(foo&) on it repeatedly with different foo instances, to get it to forward those calls to the foo's foo::operator()() method.

I know it's only a few lines, but this seems like the sort of thing which is probably already provided for by STL's functional, or boost::bind somehow. Except I can't see the trick, if there is one. (I'm sure I'm not the first person to use something very like this; does it have a name ?)


Solution

  • Yeah, you're reinventing the wheel. std::mem_fun_ref does what you want.

    std::vector<foo> foos;
    
    ...
    
    std::for_each(foos.begin(), foos.end(), std::mem_fun_ref(&foo::operator()));
    

    Alternatively:

    std::vector<foo*> foos;
    
    ...
    
    std::for_each(foos.begin(), foos.end(), std::mem_fun(&foo::operator()));
    

    Not having to mess with whether your param is ptr or not is one great benefit of boost::mem_fn.

    Anything much more complex than that though and you begin running into trouble with the C++03 binders and need something more expressive like boost.bind.