将lambdas推导到std :: function <t>

时间:2017-12-01 18:53:22

标签: c++ templates lambda std-function

我基本上试图拥有它,所以我可以从任何具有捕获的lamba创建一个通用回调:GenericCallback([=]{});

使用以下课程:

template<typename T> class GenericCallback : public Callback {
public:
    GenericCallback(const std::function<T>& f) {
        mFunction = f;
    }

    void Call() override {
        mFunction();
    }

    std::function<T> mFunction;
};

问题是我希望我定义模板参数。一般来说,这样做没有问题,但如果我使用任何捕获,无论是使用[=]还是使用特定参数,我都无法将其类型推入此结构中。

我的最终目标是稍后在指定条件下调用这些函数。

出现此错误的情况:

int v = 5;
GenericCallback<void()>([=]{ int x = v; });

1 个答案:

答案 0 :(得分:1)

你误解了std::function<>的整个概念并使问题过于复杂。在这种情况下,您可以使用std::function<void()>并绑定任何匹配的内容,只有在需要更改呼叫签名时才需要更改<>中的类型。所以

class Callback {
public:
    using callback_type = std::function<void()>;

    Callback( callback_type cb ) : m_cb( cb ) {}
    void call() { m_cb(); }

private:
    callback_type m_cb;
};

int main()
{
    int v;
    Callback c( [=]{ int x = v; } );
    c.call();
}

简单的工作,你不需要模板。在这种情况下,只有当您希望std::function将某些内容传递给该回调或者让它返回某些内容并且我怀疑您打算这样做时,才需要更改Callback::call()中的类型。

live example