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

Deducing lambdas to std::function<T>

本文关键字:lt lambda gt function std      更新时间:2023-10-16

我本质上是在尝试拥有它,以便我可以从任何带有捕获的 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; });

你误解了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()将某些内容传递给该回调或使其返回某些内容时才需要在std::function中更改类型,我怀疑您打算这样做。

现场示例