gpt4 book ai didi

c++ - std::vector of movable-only lambdas,这可能吗?

转载 作者:太空狗 更新时间:2023-10-29 20:53:11 27 4
gpt4 key购买 nike

我想要一个 lambda 集合,要求不能复制 lambda,只能 move 。
这是因为 lambas 可能需要 move 捕获他们的一些不可复制构造的参数。

例子:

NonCopyableType varName ;
auto func = [a=move(varName)](){ ... } ; //varName is move-captured

在此之后,我想将 func 存储在 vector 中,但我不能使用 std::function 类型,因为它需要可复制的 lambda。

vector<function<void()>> list ;
list.push_back(func) ; //won't work

是否可以通过其他方式做到这一点?

最佳答案

当然。只需编写您自己的只能 move 的 function 克隆。这是一个仅支持 nullary callables 的简化版本,但您可以看到如何扩展它:

class move_function
{
struct placeholder {
virtual ~placeholder() = default;
virtual void call() = 0;
};

template <class T>
struct holder : placeholder {
T f;
void call() override { f(); }
};

std::unique_ptr<placeholder> f_;

public:
template <class F,
class R = std::result_of_t<F&()>,
std::enable_if_t<!std::convertible<std::decay_t<F>*, move_function*>::value, int> = 0>
move_function(F&& f)
: f_(new std::decay_t<F>{std::forward<F>(f)})
{ }

void operator()() const { f_->call(); }
};

所有隐式定义的特殊成员函数已经为我们做了正确的事情。

关于c++ - std::vector of movable-only lambdas,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647211/

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