Как позвонить в shared_ptrиз вектора в цикле? - PullRequest
1 голос
/ 18 января 2011

У меня есть работающая система обратного вызова, которая использует 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 с вектором. Любая помощь будет аккуратной. Заранее спасибо.

1 Ответ

4 голосов
/ 18 января 2011

Это потому, что разыменование приводит к shared_ptr, а не к объекту обратного вызова:

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

Попробуйте разыменовать дважды:

        (**i)(data, size);

по желанию вы можете позвонить:

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