对于C 11中的Packaged_Task实现
我希望实现我在下面的C 14代码中所表达的内容.换句话说,我想转发一个lambda表达式.
我希望实现我在下面的C 14代码中所表达的内容.换句话说,我想转发一个lambda表达式.
template<class F> Packaged_Task(F&& f) { Promise<R> p; _future = p.get_future(); auto f_holder = [f = std::forward<F>(f)]() mutable { return std::move(f); }; ///...
我知道移植到lambda的变通方法(但不幸的是这个变通方法需要一个默认的可构造对象,在我的例子中,对象通常是没有default-constructor的lambda表达式)
解决方法
如何创建一个在复制构造过程中移动的包装器结构:(.(我知道这很糟糕,让我记住auto_ptr)
template <typename F> struct Wrapped { using Ftype = typename std::remove_reference<F>::type; Wrapped(Ftype&& f): f_(std::move(f)) {} Wrapped(const Wrapped& o): f_(std::move(o.f_)) {} mutable Ftype f_; }; template<class F> Packaged_Task(F&& f) { Promise<R> p; _future = p.get_future(); Wrapped<std::remove_reference<decltype(f)>::type> wrap(std::forward<F>(f)); auto f_holder = [wrap]() mutable { return std::move(wrap.f_); };
这只是一个粗略的想法.未编译或测试.
注意:之前我已经看过这种技术,不记得它是在SO本身还是在某些博客上.