【问题标题】:How to call shared_ptr<boost::signal> from a vector in a loop?如何从循环中的向量调用 shared_ptr<boost::signal>?
【发布时间】:2011-01-18 02:23:13
【问题描述】:

我有一个使用 boost::signal 的有效回调系统。我将它扩展为一个更灵活、更高效的回调管理器,它使用 shared_ptr 的向量来处理我的信号。我已经能够成功地创建回调并将其添加到列表中,但我不清楚如何实际执行信号。

...

// Signal aliases
typedef boost::signal<void (float *, int32_t)> Callback;
typedef std::shared_ptr<Callback> CallbackRef;

// The callback list
std::vector<CallbackRef> mCallbacks;

// Adds a callback to the list
template<typename T>
void addCallback(void (T::* callbackFunction)(float * data, int32_t size), T * callbackObject) 
{
    CallbackRef mCallback = CallbackRef(new Callback());
    mCallback->connect(boost::function<void (float *, int32_t)>(boost::bind(callbackFunction, callbackObject, _1, _2)));
    mCallbacks.push_back(mCallback);
}

// Pass the float array and its size to the callbacks
void execute(float * data, int32_t size)
{

    // Iterate through the callback list
    for (vector<CallbackRef>::iterator i = mCallbacks.begin(); i != mCallbacks.end(); ++i)
    {

        // What do I do here?
        // (* i)(data, size); // <-- Dereferencing doesn't work

    }   

}

...

所有这些代码都有效。我只是不确定如何使用向量从 shared_ptr 中运行调用。任何帮助都会很整洁。提前谢谢。

【问题讨论】:

  • mCallback.connect(b...); 有效吗?那不应该是mCallback-&gt;connect(...);
  • 射击,对不起,没有。你说得对。真正的代码在上下文中很长,所以我手动输入了所有这些。修好了。

标签: c++ pointers boost-bind boost-function boost-signals


【解决方案1】:

这是因为取消引用会产生一个 shared_ptr,而不是回调对象:

        // (* i)(data, size); // <-- Dereferencing doesn't work

尝试解引用两次:

        (**i)(data, size);

您可以选择调用:

        (*i)->operator()(data, size);

【讨论】:

  • 取消引用两次做到了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2011-09-13
相关资源
最近更新 更多