容器如何处理Lambda表达式的参数

时间:2018-08-22 08:55:39

标签: c++ lambda containers

几个月前,我跟着上一个问题,我想问一个容器如何在内部处理Lampda表达式。

假设以下代码:

#include <iostream>
#include <type_traits>
#include <queue>
#include <functional>

std::queue<std::function<void()>> funcs;

class A
{
    public:
      A()
      {
        std::cout << "A constructor" << std::endl;
      }
      void foo(int a)
      {
      }
};

class ThePool
{
   public:
    template <typename _Callable, typename Object, typename... _Args>
    void QueueFunction(_Callable __f, Object& obj, _Args... __args)
    {
        funcs.push([__f, &obj, &__args...]() mutable
            {
                (obj.*__f)(__args...);
            });
    }
};

int main(int argc, char** argv)
{
    ThePool t;
    A a;
    int x = 5;
    t.QueueFunction(&A::foo, a, x);
    std::function<void()> func = funcs.back();
    func();
    return 0;
}

如果将A类和args的实例作为值传递,则很明显将复制这些值。如果将类A的实例作为引用,而将args用作引用,我会感到困惑。我知道在内部在容器中进行复制。从我的角度来看,函数指针的地址将被复制。是否也可以复制obj和args的实例?

举个例子,我注意到当我以A实例作为引用并最终为队列提取函数f并将其称为A的实例时,这并不相同。

0 个答案:

没有答案