C++ 将lambda推导为std::function<;T>;
我实际上是在尝试使用它,这样我就可以使用捕获从任何lamba创建一个通用回调:C++ 将lambda推导为std::function<;T>;,c++,templates,lambda,std-function,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()
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;
};
您误解了std::function
的整个概念,使问题变得过于复杂。在这种情况下,您可以使用std::function
,并将任何内容绑定到它,只有在需要更改调用签名时,才需要更改
中的类型。所以
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_type=std::function;
回调(回调类型cb):m_cb(cb){}
void call(){m_cb();}
私人:
回调类型m_cb;
};
int main()
{
INTV;
回调c([=]{intx=v;});
c、 call();
}
将简单的工作,你不需要模板那里。只有当您希望Callback::call()
将某个内容传递给该回调或使其返回某个内容时,才需要更改std::function
中的类型,我怀疑您是否打算这样做
您能提供一个具体的例子吗?我有一个想法,但不确定在这种情况下是否有效。@ComputableGenericCallback([=]{})代码>“我无法将类型推入此结构中。”怎么会这样GenericCallback{[=]{}
工作正常。@MikeWeir,看起来你在寻找类型擦除。你们班不能这样做。事实上,它与std::function
@MikeWeir具有相同或更少的功能,std::function
可以存储与给定签名兼容的任何可调用函数,因此std::function a([some_int]{return some_int;})代码>是完全有效的。所以你只需要一个std::function
数组,并存储任何不带参数的可调用对象。你完全正确。谢谢你为我澄清这一点。
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();
}