其他分享
首页 > 其他分享> > c – 鉴于以下内容,“功能”是什么类型?

c – 鉴于以下内容,“功能”是什么类型?

作者:互联网

鉴于以下内容,“功能”是什么类型?

#include <functional>
#include <vector>

template<class T>
class Foo
{
public:

    template<typename P, typename Q, typename R, typename... Args>
    void Attach(P (Q::*f)(Args...), R p)
    {
        auto function = [p, f](Args... args)
        {
            (*p.*f)(args...);
        };

        Listeners.push_back(function);
    }   

private:

    std::vector<std::function<T>> Listeners;
};

class Bar
{
public:

    int Handler(int x, int y, int z)
    {
        return 0;
    }
};

int main(void)
{
    auto foo = Foo<int(int, int, int)>();
    auto bar = Bar();

    foo.Attach(&Bar::Handler, &bar);
}

对于某些上下文,我试图创建一个lambda来调用实例上的方法,将该lambda存储到一个集合中.我的push_back无法编译,出现以下错误:

xrefwrap(283): error C2440: ‘return’ : cannot convert from ‘void’ to
‘int’

我最初使用std :: bind来创建一个我可以存储的std :: function.显然我可以用lambda(和可变参数模板,所以我不需要每个模板一个模板),但到目前为止,它击败了我.

解决方法:

构造Foo时,提供的显式模板参数是auto foo = Foo< int(int,int,int)>();,

int main(void)
{
    auto foo = Foo<int(int, int, int)>(); //<<<< Here is the template arguments when constructing Foo 
    auto bar = Bar();

    foo.Attach(&Bar::Handler, &bar);
}

在注册侦听器时,函数签名返回类型为void

auto function = [p, f](Args... args)
    {
        (*p.*f)(args...);
    };

解析度

所以要么你

>更改Foo的显式模板参数,auto foo = Foo< void(int,int,int)>();返回void以匹配您的侦听器回调.
>或确保您的侦听器函数返回一个整数. return(* p.* f)(args …);

注意可能您打算从侦听器返回状态代码,但您可能错过了?所以第二个决议点在我看来是一个明显合理的问题

标签:std-function,c,lambda
来源: https://codeday.me/bug/20190824/1710775.html