Search code examples
c++c++11std-function

Functor reference through a std::function


Basically, I would like to have the following semantic :

#include <functional>
#include <iostream>

class test
{
  public:
    void add(std::function<void()> f)
    {
      f();
    }

    void operator()()
    {
      ++x;
    }

    int x = 33;
};

int main()
{
  test t;
  t.add(t);
  // wanted: x == 34 instead: x == 33 since add(t) copies it
}

I understand std::function wraps a copy of the callable object but is there any way to get a reference to a callable object using std::function?


Solution

  • You want to use the std::ref template function to create a reference wrapper for your instance:

    std::reference_wrapper is a class template that wraps a reference in a copyable, assignable object.

    Function templates ref and cref are helper functions that generate an object of type std::reference_wrapper, using template argument deduction to determine the template argument of the result.

    You would use it like this:

    t.add(std::ref(t));