获取lambda捕获值的参考

时间:2017-01-09 11:58:10

标签: c++ c++11 lambda c++14

我正在使用一个函数(不是我的,来自我无法控制的库),其签名类似于:

template<typename T, typename F>
void do_async(T const&, F); // the second parameter is a callable

它通常像这样使用

do_async(obj, [this](){ ... });

我编写了一个类似于此的函数,它始终使用相同的回调lambda:

template<typename T>
void do_async_wrapper(T obj) {
    do_async(obj, [this](){ ... });
}

我的问题源于这样一个事实,即由于obj作为引用传递,因此必须保持活动状态,直到调用回调为止。我的功能应该是照顾,所以调用者不必担心对象的生命周期。这就是它接受价值的原因 我想做这样的事情,以保持活着:

template<typename T>
void do_async_wrapper(T obj) {
    do_async(obj, [this, obj{std::move(obj)}](){ ... });
}

显然,这不会(总是)按原样工作,因为引用指向不再存在的函数 - 本地函数,而保持活动的函数是它的(移动)副本。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

由于函数是按值获取的,因此无法将对象直接存储在仿函数中并传递对它的引用。 您可以通过将智能指针用作shared_ptr

来解决这个问题
template<typename T>
void do_async_wrapper(T obj) {
    auto ptr = std::make_shared<T>(std::move(obj));
    do_async(*ptr, [this, ptr](){ /*...*/ });
}