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