【问题标题】:Boost function: store any function returned by boost::bind?Boost 函数:存储 boost::bind 返回的任何函数?
【发布时间】: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&lt;void()&gt; 和使用 boost::bind 将所有参数绑定到可调用实体(函数、函子等)有何不同。既然您已经熟悉boost::bind,那么您究竟在寻找什么不同之处?
  • 我希望能够绑定具有任何签名的函数,而不仅仅是 void()。这就是问题的原因。
  • @user300713: boost::function&lt;void()&gt; 可以保存任何可以不带参数调用的函数对象,并且它忽略返回类型(因为它本身返回void),因此您可以存储任何函数或所有参数都绑定到它的函数对象。由于您在没有参数的情况下调用call(),因此您可能已经将所有参数绑定到函数对象。
  • 啊,好吧,我想这正是我当时所寻找的。我现在就试试,谢谢!
  • @moka : 如果那是真正的代码,你应该给TimedFunctionBase一个virtual析构函数

标签: c++ function boost


【解决方案1】:

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

【讨论】:

  • hmm 那么如何声明带有任何签名的 boost 函数?
  • 诀窍是你不绑定“任何签名”,你必须通过使用绑定从 void(whatever) 到 void() 将参数嵌入到一个空函数对象中。
  • 好吧,我错过了如果参数已经绑定到函数对象,那是另一回事。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多