std :: vector of moving-only lambdas,有可能吗?

时间:2017-04-27 01:35:10

标签: c++ lambda c++14 move-semantics

我想要一组lambdas,要求不得复制lambas,只能移动。
这是因为lambas可能需要移动 - 捕获一些不是可复制构造的参数。

示例:

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

在此之后我想将func存储在vector中,但我无法使用std::function类型,因为它要求lambdas可以复制。

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

是否有可能以其他方式做到这一点?

1 个答案:

答案 0 :(得分:4)

不确定。只需编写自己的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(); }
};

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