【发布时间】:2018-03-09 06:49:40
【问题描述】:
我想做一个每 X 秒调用一次的成员函数。做了一个可以处理非成员函数的小原型,不知道做的好不好,不能同时处理成员函数和非成员函数。
我有一个Event 对象,它处理函数和延迟,并带有一个基本计时器,以检测我们何时需要运行该函数:
typedef void (*ScheduleFunction)(float dt);
class Event
{
private:
ScheduleFunction m_Func;
double m_Timer;
double m_Delay;
public:
Event(ScheduleFunction function, double delay)
{
m_Func = function;
m_Delay = delay;
}
void Call(float dt)
{
m_Timer += dt;
if (m_Timer >= m_Delay)
{
m_Func(dt);
m_Timer = 0.0;
}
}
};
然后,我有另一个对象,它将每个帧的每个函数都调用为vector<Event>:
class Handler
{
private:
void m_MemberFunction(float dt)
{
std::cout << "A member function." << std::endl;
}
std::vector<Event> m_ScheduleItems;
public:
Handler()
{
// This will not compile, because the function expect a non member function
Schedule(&Handler::m_MemberFunction, 1.0);
}
void CallScheduledFunctions(float dt)
{
for (std::vector<Event>::iterator it = m_ScheduleItems.begin(); it != m_ScheduleItems.end(); ++it)
{
it->Call(dt);
}
}
void Schedule(ScheduleFunction func, double delay)
{
Event event(func, delay);
m_ScheduleItems.push_back(event);
}
void Unschedule()
{
// TODO
}
};
如您所见,我有一个函数Schedule 注册新的Event。但现在,它只处理非成员函数。有没有一种方法可以处理非成员函数和成员函数,不仅来自 Handler,而且还来自 所有其他对象?
如果没有办法,我该如何实现呢?
【问题讨论】:
-
std::function或 C 风格的回调,将指向用户提供的上下文的不透明指针作为额外参数。 -
将
ScheduledFunction设为模板参数并使用std::invoke调用。或者如果你想混合std::function
标签: c++ scheduled-tasks function-pointers member