在类中存储Lambda

voi*_*ter 0 c++ lambda inline c++11

当需要将lambda存储为类成员以便可以延迟调用时,最佳实践是什么?更具体地说,将传递给deferred_lambda下面的代码清单中的类的lambda存储为参考是否安全?如果不是,如果我将lambda存储deferred_lambda为值而不是作为引用,是否安全?

最后,与使用g ++进行常规函数调用相比,我是否可以预期会产生性能损失,以便以这种方式将lambda存储为类成员?也就是说,使用deferred_lambda.invoke()operator()实现相同操作的某个虚拟结构的调用要慢?

使用g ++,我注意到lambda的大小随着我使用更多捕获的变量而增加.我想这是可以预料到的,因为根据我的理解,编译器在内部为lambda生成一个struct,它包含必要的捕获变量作为成员.这种观察导致了我现在要问的问题,因为按时间和内存存储lambda值可能比存储对它们的引用更昂贵.

template <class Func>
class deferred_lambda
{
    Func& func_;
public:
    deferred_lambda(Func func) : func_(func) {}
    void invoke() { func_(); }
};

template <class Func>
deferred_lambda<Func> defer_lambda(Func func)
{
    return deferred_lambda(func);
}

void foo()
{
    int a, b, c;
    auto x = defer_lambda([&]() { a = 1; b = 2; c = 3; });
} 
Run Code Online (Sandbox Code Playgroud)

Dae*_*min 7

我相信存储lambda以供以后执行的方法是使用一个std::function对象.根据库实现,function类应该具有必要的构造函数和转换器,以便为其稍后执行分配lambda或任何其他类型的函子或函数.