【问题标题】:Functor reference through a std::function通过 std::function 引用函子
【发布时间】:2014-08-11 18:33:57
【问题描述】:

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

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

【问题讨论】:

  • 请用您正在使用的编程语言标记您的问题,以便它显示在相应的列表中。
  • +1 对于std::ref()这样一个很好的例子

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


【解决方案1】:

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

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

函数模板refcref 是帮助函数,它们生成一个 std::reference_wrapper 类型的对象,使用模板参数 推导确定结果的模板参数。

你会这样使用它:

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

【讨论】:

  • 完美 :o 这应该在在线参考资料中解释:/
【解决方案2】:

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

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

这对我来说似乎更具可读性(但这只是因为我熟悉 lambdas 而不是 std::bind)。这种区别可能让人想起 Scott Meyers 的 Effective Modern C++, #34: Prefer Lambdas to std::bind 中的一个条目。

【讨论】:

  • 在这种简单的情况下,一个 lambda 是可读的并且可以工作。但是如果函数有参数和/或返回值,它就会变得更加冗长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多