【发布时间】:2011-05-05 15:24:04
【问题描述】:
我想写一个异步定时器,在经过一定时间后调用一个函数。现在,我希望能够使用boost::bind() 将函数与计时器在经过特定间隔后调用的任何签名绑定。我现在这样做的方式是受到 boost thread 的启发,它有一个抽象的基类来存储线程函数。我就是这样做的:
class TimedFunctionBase
{
public:
virtual void call() = 0;
};
typedef std::shared_ptr<TimedFunctionBase> TimedFunctionBasePtr;
template<class F>
class TimedFunction : public TimedFunctionBase
{
public:
TimedFunction(F _f):
m_function(_f)
{
}
void call()
{
m_function();
}
private:
F m_function;
};
然后,在定时器函数内部,我简单地保存回调如下:
MyAsyncTimer
{
private:
TimedFunctionBasePtr m_callback;
};
并在定时函数中调用它
m_callback->call();
我的问题其实很简单:boost 是否已经提供了一种机制来做到这一点?经过长时间的搜索,我真的找不到太多东西,boost::thread 的内部结构也看起来好像没有为这种用途预定义任何东西。也许boost::function_base?文档说您可能不会直接创建它。有没有一种提升方式,还是我必须自己编写这些容器类?
【问题讨论】:
-
我看不出这与仅使用
boost::function<void()>和使用boost::bind将所有参数绑定到可调用实体(函数、函子等)有何不同。既然您已经熟悉boost::bind,那么您究竟在寻找什么不同之处? -
我希望能够绑定具有任何签名的函数,而不仅仅是 void()。这就是问题的原因。
-
@user300713:
boost::function<void()>可以保存任何可以不带参数调用的函数对象,并且它忽略返回类型(因为它本身返回void),因此您可以存储任何函数或所有参数都绑定到它的函数对象。由于您在没有参数的情况下调用call(),因此您可能已经将所有参数绑定到函数对象。 -
啊,好吧,我想这正是我当时所寻找的。我现在就试试,谢谢!
-
@moka : 如果那是真正的代码,你应该给
TimedFunctionBase一个virtual析构函数