将 lambda 推导为 std::function<T>

Deducing lambdas to std::function<T>

我基本上是想拥有它,这样我就可以从任何带有捕获的兰巴舞创建一个通用回调:GenericCallback([=]{});

使用以下 class:

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; });

您误解了 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();
}

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

live example