【发布时间】:2018-09-12 21:49:09
【问题描述】:
有没有办法同时为函数和成员函数使用函数指针?
我想创建一种事件句柄,它可以保存类的成员函数,同时它应该能够具有“普通”函数指针。
编辑:我找到了解决方案。可能不是最好的,而是一个;
事件.h
#include <map>
class BasicEvent {
public:
BasicEvent(int id) : eventId(id)
{}
int GetId() const
{
return eventId;
}
virtual void ObjectMethode() {}
protected:
const int eventId;
};
class BasicEventHandler {
public:
void Trigger(BasicEvent* event)
{
if (this->eventMap.find(event->GetId()) != this->eventMap.end()) {
eventMap[event->GetId()](event);
}
}
void AddEvent(int id, std::function<int(BasicEvent*)> eventFunction)
{
eventMap[id] = eventFunction;
}
void RemoveEvent(int id)
{
this->eventMap.erase(id);
}
private:
std::map<int, std::function<int(BasicEvent*)>> eventMap;
};
main.cpp
class CustomEvent : public BasicEvent {
public:
CustomEvent(int id) : tq::BasicEvent(id)
{
x = 9;
y = 8;
}
struct {
int x;
int y;
};
void ObjectMethode()
{
std::cout << this->eventId << " Custom Event: X: " << x << " Y: " << y << '\n';
}
};
int main() {
BasicEventHandler myHandler;
myHandler.AddEvent(0, [&](BasicEvent* event) {
std::cout << " EVENT <" << event->GetId() << "> Triggered!\n";
return 0;
});
myHandler.AddEvent(1, [&](tq::BasicEvent* event) {
event->ObjectMethode();
return 0;
});
myHandler.Trigger(&BasicEvent(0));
myHandler.Trigger(&CustomEvent(1));
return 0;
}
【问题讨论】:
-
你不能用std::function吗?另请参阅 std::bind 和 std::invoke。
-
我不这么认为。我现在将提供两种解决方案。一个用于班级成员,一个用于功能