将带有unique_ptr的可变lambda传递给const&std :: function

汤姆森汤姆

我有一个调度函数,该函数在主线程中执行给定的lambda。为了这个问题,假设它看起来如下:

void dispatch(const std::function<void()>& fn) {
    fn();
}

我需要在不中断主线程的情况下在新线程中加载新对象。因此,我执行以下操作:1)启动一个新线程并在该线程内创建一个新的唯一指针,2)调用dispatch并传播它所属的新唯一指针。

std::unique_ptr<std::string> foo; // nullptr

// do the loading in a new thread:
std::thread t([&](){
    // in the new thread, load new value "Blah" and store it temporarily
    auto bar = std::make_unique<std::string>("Blah");
    dispatch([bar2 = std::move(bar), &foo]() mutable {
        foo = std::move(bar2); // propagate the loaded value to foo
    });
});
t.join(); // for the sake of this example

std::cout << "foo = " << *foo << std::endl; // this should say: foo = Blah

在线运行示例:http : //cpp.sh/5zjvm

此代码不编译,因为在内部拉姆达dispatch就是mutable,因此不适合dispatch(const std::function<void()>& fn)其需要const&

但是,lambda必须是mutable因为它需要调用std::move唯一的指针。

例如,可以通过更改dispatch为以下代码来修复此代码

template <typename Fn>
void dispatch(Fn fn) {
    fn();
}

不幸的是,该dispatch函数是库的API,我无法对其进行更改。

有没有摆脱唯一指针的方法来解决这个问题?

Yakk-亚当·内夫罗蒙特

不,那不是你的问题。

您的问题是您的lambda无法复制,因为它具有按值捕获的唯一ptr。

std::function<Sig> 类型擦除到

  1. 调用 Sig

  2. 破坏

  3. 复制(有时移动)

  4. 退回原始类型

您的lambda无法复制,因此无法存储在中std::function

惰性编码器的解决方案是:

    dispatch([bar2 = std::make_shared<decltype(bar)>(std::move(bar)), &foo]() mutable {
        foo = std::move(*bar2);
    });

我们将不可复制的状态推到shared_ptr

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用std :: function对象将自定义删除器传递给std :: unique_ptr

无法在 std::function<> 中传递 std::unique_ptr

将带有参数的void方法传递给具有std :: function和std :: bind C ++的另一种方法

c#P / Invoke:将带有IntPtr的枚举值传递给Function;AccessViolationException

将lambda传递给可变参数std :: function时的类型推断

如果std :: function捕获了unique_ptr,该如何复制?

将shared_ptr传递给std :: function(成员函数)

将 std::function 作为参数传递给 const void *

如何将std :: function对象传递给带有函数指针的函数?

将lambda参数传递给没有中间变量的std :: function参数

将成员函数和 lambda 传递给 std::function

将输入参数传递给lambda函数中的std :: function

无法将带有NULL删除器的std :: unique_ptr移动到std :: shared_ptr?

const std :: function包装了一个非const operator()/可变lambda

如何将std :: unique_ptr传递给函数

将std :: unique_ptr传递给类时出错

将std :: unique_ptr传递给构造函数以获取所有权

带有lambda自定义删除程序的std :: unique_ptr无法编译

C ++将std :: function对象传递给可变参数模板

将const类对象传递给std :: function和std :: bind导致编译错误

调用带有std :: function作为lambda参数的函数

将带有捕获的lambda传递给模板化函数

将带有已移动捕获的lambda传递给函数

带有 std::function 的 RAII

将std :: function *传递给模板参数

带有unique_ptr捕获的asio lambda

带有 lambda 删除器的 Unique_ptr

带有std :: unique_ptr的clang错误

铛,返回带有类型转换的std :: unique_ptr