我正在使用一个函数(不是我的,来自我无法控制的库),其签名类似于:
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)}](){ ... });
}
显然,这不会(总是)按原样工作,因为引用指向不再存在的函数 - 本地函数,而保持活动的函数是它的(移动)副本。
有什么建议吗?
答案 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](){ /*...*/ });
}