我想写一个异步计时器,在经过一段时间后调用函数。现在我希望能够使用boost::bind()
将函数绑定到定时器在经过一段时间后调用的任何签名。我现在这样做的方式是受boost线程的启发,boost线程有一个抽象基类来存储线程函数。这是我做的:Boost函数:存储由boost :: bind返回的函数吗?
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::thread
的内部也看起来好像没有预定义这种用法。也许boost::function_base
?文档说,你可能不会直接创建它。有一种提升方式,还是我必须自己编写这些容器类?
我不明白这与仅仅使用'boost :: function'并使用'boost :: bind'将所有参数绑定到可调用实体(函数,函数等)的方式有很大不同。既然你已经熟悉'boost :: bind',你究竟在寻找什么不同? –
2011-05-05 15:28:58
我希望能够绑定一个函数与任何签名,而不仅仅是void()。这是问题的原因。 – moka 2011-05-05 15:31:41
@ user300713:'boost :: function'可以容纳任何可以不带参数调用的函数对象,它忽略返回类型(因为它本身返回'void'),因此可以存储任何函数或函数对象有它的所有论据。由于您正在调用不带参数的'call()',可能您已经将所有参数绑定到函数对象。 –
2011-05-05 16:01:49