我实际上是在尝试拥有它,这样我就可以从任何带捕获的兰巴舞创建一个通用回调: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()>
在这种情况下,并绑定(bind)与它匹配的任何内容,您需要更改 <>
中的类型仅当您需要更改调用签名时。所以
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()
将某些内容传递给该回调或使其返回某些内容,我怀疑您打算这样做。
关于c++ - 将 lambda 推导为 std::function<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47599764/