通过std :: function引用的Functor

时间:2014-06-20 22:55:24

标签: c++ c++11 std-function

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

#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来获取对可调用对象的引用?

2 个答案:

答案 0 :(得分:23)

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

  

std::reference_wrapper是一个包装引用的类模板   可复制的,可分配的对象。

     

函数模板refcref是生成函数的辅助函数   类型std::reference_wrapper的对象,使用模板参数   扣除以确定结果的模板参数。

您可以这样使用它:

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

答案 1 :(得分:0)

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

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

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