gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:23 24 4
gpt4 key购买 nike

我有一个调度函数,它在主线程中执行给定的 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 中的内部 lambda是mutable所以不适合 dispatch(const std::function<void()>& fn)这需要 const& .

但是,lambda 必须是 mutable因为它需要调用 std::move在独特的指针上。

此代码可以通过更改 dispatch 来修复。到:

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

不幸的是,dispatch函数是库的 API,我无法更改它。

有没有办法在不删除唯一指针的情况下解决这个问题?

最佳答案

不,那不是你的问题。

你的问题是你的 lambda 不能被复制,因为它有一个由值捕获的唯一 ptr。

std::function<Sig>键入删除到

  1. 调用Sig

  2. 销毁

  3. 复制(有时移动)

  4. 转换回原始类型

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

lazy-coder 的解决方案是:

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

我们将不可复制状态插入 shared_ptr 中.

关于c++ - 将带有 unique_ptr 的可变 lambda 传递给 const& std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53014418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com