通过std :: function的Functor引用

问题描述 投票:20回答:2

基本上,我希望具有以下语义:

#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
}

我了解std :: function包装可调用对象的副本,但是有什么方法可以使用std :: function获得对可调用对象的引用?

c++ c++11 std-function
2个回答
23
投票

您想使用std::ref模板功能为您的实例创建std::ref

reference wrapper是一个类模板,它将引用包装在可复制的可分配对象。

功能模板std::reference_wrapperref是帮助函数,可生成类型为cref的对象,使用模板参数推导以确定结果的模板参数。

您会这样使用它:

std::reference_wrapper

0
投票

[另一种方法是传入lambda-将t绑定为参考:

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

对我来说,这似乎更具可读性(但仅是因为我熟悉lambda而不是std :: bind)。这种区别也许让人想起斯科特·迈耶斯(Scott Meyers)的作品[[Effective Modern C ++,#34:更喜欢Lambdas而不是std :: bind。

© www.soinside.com 2019 - 2024. All rights reserved.