将 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
中的类型,我怀疑您打算这样做。
我基本上是想拥有它,这样我就可以从任何带有捕获的兰巴舞创建一个通用回调: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
中的类型,我怀疑您打算这样做。