我试图找到一种方法来提供指向不同类实例之间的成员函数的指针。目前,我能够提供指向不带参数的成员函数的指针,但是当指向的函数具有参数时,就无法做到这一点。
示例代码来说明我的问题:
#include <iostream>
class Event
{
public:
std::string type;
Event(std::string type):type(type){}
};
class EventDispatcherBase
{
public:
void addEventListener(std::function<void(Event &event)> listener)
{
Event myEvent("Type of the myEvent object");
listener(myEvent);
}
};
class EventDispatcherClass:public EventDispatcherBase
{
public:
EventDispatcherClass()
{
addEventListener([](Event &event){std::cout << event.type << std::endl;});
//addEventListener([this]{listener(Event event);});
};
void listener(Event &event)
{
std::cout << event.type << std::endl;
}
};
int main()
{
EventDispatcherClass eventDispatcherClass;
return 0;
}
此代码与匿名lambda表达式一起使用,并在控制台中输出“ myEvent对象的类型”。但是如果我取消注释
addEventListener([this]{listener(Event event);});
为了传递指向void listener(Event &event)
成员函数的指针,在EventDispatcherClass的构造函数中,编译器抛出以下错误:
没有从'((... / main.cpp:27:26)处的lambda)转换为'std :: function'的可行转换
我不明白为什么。
工作线:
addEventListener([](Event &event){std::cout << event.type << std::endl;});
看起来不像是坏掉的那个:
//addEventListener([this]{listener(Event event);});
因此,请先一点一点地更改工作线。
添加您想要的捕获表达式,它仍然有效
addEventListener([this](Event &event){std::cout << event.type << std::endl;});
将身体更改为所需的身体,它仍然有效
addEventListener([this](Event &event){ this->listener(event); });
如果您无法看到的是两个版本之间的不同-这实际上是当你自己写了他们和你看到的很常见你打算键入,而不是那里的东西-尝试改变布局,样样在行了(所以你会看到缺少的(Event &event)
),或按上述步骤逐步将其转换为另一种,或仅将另一种替换为另一种并比较文件版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句