Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将lambda推导为std::function<;T>;_C++_Templates_Lambda_Std Function - Fatal编程技术网

C++ 将lambda推导为std::function<;T>;

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()

我实际上是在尝试使用它,这样我就可以使用捕获从任何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;
};

您误解了
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
中的类型,我怀疑您是否打算这样做


您能提供一个具体的例子吗?我有一个想法,但不确定在这种情况下是否有效。@Computable
GenericCallback([=]{})“我无法将类型推入此结构中。”怎么会这样
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();
}