2011-01-18 8 views
1

私はboost :: signalを使用している実際のコールバックシステムを持っています。私はshared_ptrのベクトルを自分の信号に使う、より柔軟で効率的なコールバックマネージャに拡張します。私は正常に作成し、リストにコールバックを追加することができましたが、私は実際に信号を実行する方法については不明です。ループ内のベクトルからshared_ptr <boost :: signal>を呼び出す方法は?

... 

// 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 

    } 

} 

... 

このコードはすべて動作します。私は、vectorからshared_ptrの中から呼び出しを実行する方法がわかりません。どんな助けも素敵です。前もって感謝します。 、shared_ptrのではないコールバックオブジェクトを結果を逆参照するためです

+0

はmCallback '行います。接続する(b ...); '仕事?それは 'mCallback-> connect(...);' – Mic

+0

にするべきではありません。あなたが正しい。実際のコードは文脈の中で長く描かれているので、私はこれを手作業で入力しました。修正しました。 – BTR

答えて

4

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

てみ二回逆参照:

 (**i)(data, size); 

は、必要に応じて呼び出すことができます。

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

2度間接参照しました。ありがとう! – BTR

関連する問題