Functor reference through a std::function

旧时模样 提交于 2019-12-06 16:54:19

问题


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?


回答1:


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));



回答2:


Another approach would be to pass in a lambda - binding t as a reference:

t.add( [&t]{ t(); } );

This seems more readable to me (but only because I'm familiar with lambdas and not std::bind). The distinction is perhaps reminiscent of an item in Scott Meyers' Effective Modern C++, #34: Prefer Lambdas to std::bind.



来源:https://stackoverflow.com/questions/24336790/functor-reference-through-a-stdfunction

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!