gpt4 book ai didi

c++ - 广义 lambda 的 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:51 31 4
gpt4 key购买 nike

假设我们有这样一段代码:

std::vector<std::function<void()>> tasks;

然后我们添加这样的任务:

tasks.push_back([]()
{
// ...
}

这行得通。但现在我们要添加该任务:

std::unique_ptr<int> v(new int(10));
tasks.push_back([v = std::move(v)]()
{
// ...
}

并且这段代码没有编译。

为了更清楚:

std::unique_ptr<int> v(new int(10));
std::function<void()> test = [v = std::move(v)]()
{
};

存在编译错误。因为 lambda 的类型不是 std::function<void()> .但是什么是类型呢?

最佳答案

没有 lambda 是 std::functionstd::function 是一个类型删除器——它接受任何带有签名的可销毁、可复制和可调用的内容,并删除该类型的其余部分。

由于无法复制您的 lambda,因此无法将其存储在 std::function 中。

您可以使其可复制(例如,通过将其状态存储在 std::shared_ptr 中),或者编写一个仅可移动的 std::function

#include <utility>
#include <memory>

template<class Sig>class func;
namespace details{
template<class Sig>struct inner;
template<class R,class...Args>
struct inner<R(Args...)>{
virtual ~inner() {};
virtual R invoke(Args&&...args) =0;
};
template<class F,class Sig>struct impl;
template<class F,class R,class...Args>
struct impl<F,R(Args...)>:inner<R(Args...)>{
F f;
template<class... Ts>
impl(Ts&&...ts):f(std::forward<Ts>(ts)...){}
R invoke(Args&&...args)override{
return f(std::forward<Args>(args)...);
}
};
}
template<class T>struct emplace_as{};
template<class R,class...Args>
class func<R(Args...)>{
std::unique_ptr<details::inner<R(Args...)>> pImpl;
public:
R operator()(Args...args){
return pImpl->invoke(std::forward<Args>(args)...);
}
explicit operator bool()const{return pImpl;}
func(func&&)=default;
template<class F,class...Ts,class=typename std::enable_if<
std::is_convertible<decltype(std::declval<F>()(std::declval<Args>()...)),R>::value
>::type>
func(emplace_as<F>,Ts&&...ts):
pImpl( new details::impl<F, R(Args...)>{std::forward<Ts>(ts)...} )
{}

template<class F,class=typename std::enable_if<
std::is_convertible<decltype(std::declval<F>()(std::declval<Args>()...)),R>::value
>::type>
func(F&&f):
func(
emplace_as<typename std::decay<F>::type>(),
std::forward<F>(f)
)
{}
};

something like that .

(需要添加的功能:此重载的右值引用在 () 上,可能是 swap,可能是 assignemplace ,可能是 result_type 等的类型定义),可能是 targettarget_type)

关于c++ - 广义 lambda 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26319788/

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