广义lambdas的向量
Vector of generalized lambdas
假设我们有这样的代码:
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::function
。std::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)
)
{}
};
或者类似的东西。
(需要添加的功能:对()
、swap
、assign
和emplace
、result_type
的typedefs等重载的右值引用),可能是target
和target_type
)
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- STD ::仅移动的Lambdas的向量是可能的
- Lambdas的C 向量 - 未定义的参考
- 如何声明功能向量(lambdas)
- 广义lambdas的向量