2011-05-05 75 views
4

我想写一个异步计时器,在经过一段时间后调用函数。现在我希望能够使用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?文档说,你可能不会直接创建它。有一种提升方式,还是我必须自己编写这些容器类?

+0

我不明白这与仅仅使用'boost :: function '并使用'boost :: bind'将所有参数绑定到可调用实体(函数,函数等)的方式有很大不同。既然你已经熟悉'boost :: bind',你究竟在寻找什么不同? – 2011-05-05 15:28:58

+0

我希望能够绑定一个函数与任何签名,而不仅仅是void()。这是问题的原因。 – moka 2011-05-05 15:31:41

+1

@ user300713:'boost :: function '可以容纳任何可以不带参数调用的函数对象,它忽略返回类型(因为它本身返回'void'),因此可以存储任何函数或函数对象有它的所有论据。由于您正在调用不带参数的'call()',可能您已经将所有参数绑定到函数对象。 – 2011-05-05 16:01:49

回答

5

boost :: bind + boost :: function是你所需要的。而IIRC,这就是线程所做的。

+0

hmm,所以我怎样才能声明一个带有任何签名的提升函数? – moka 2011-05-05 15:34:29

+0

诀窍是你不绑定“任何签名”,你必须从void(无论)void()中通过usign绑定将参数嵌入到无函数对象中。 – 2011-05-05 15:40:12

+0

好吧,我错过了,如果参数已经被绑定到函数对象,那么它是一个不同的事情。谢谢! – moka 2011-05-05 16:09:09

0

我认为boost :: asio提供了一些机制来做到这一点,这tutorial似乎正是你想要的。