2011-10-25 11 views
0

TR1ファンクタのマルチキャストはどのように実装しますか?コールバックスロットはTR1関数マルチキャスト

void setCallback(std::tr1::function<void (std::string)> cb) 
{ 
    this->callback = cb; 
} 

のように実装されていますが、そのうちの1つに複数のコールバックを渡す必要があります。私はオブザーバーのようなもっと複雑な解決法に行きたいとは思っていません。なぜならこれはこれまでのところマルチキャストが必要な唯一のケースだからです。 Boostを使用することはできないので、Boost.Signals(推奨here)も使用できません。私は、加入者がもはや存在しなくなったときに無効にするコールバックを明示的に処理する必要はありません。

答えて

3

あなたが最も可能性が高いとしますstd::tr1::functionオブジェクトの代わりに、単一のものの(あなたが好きな方)callbacksコンテナと

void registerCallback(std::tr1::function<void (std::string)> cb) 
{ 
    this->callbacks.push_back(cb); 
} 

。ディスパッチするときに、コールバックを反復処理します。

後でコールバックを削除できるようにしたい場合も、あなたはこれらの線に沿って何かを行うことができます。

// I use list because I don't want the iterators to be invalid 
// after I add/remove elements 
std::list<std::function<void(std::string)>> callbacks; 

... 
typedef std::list<std::function<void(std::string)>>::iterator callback_id; 

callback_id register_callback(std::function<void(std::string)> f) 
{ 
    return callbacks.insert(callbacks.end(), f); 
} 

void unregister_callback(callback_id id) 
{ 
    callbacks.erase(id); 
} 
0

単一の関数ではなく、それらのシーケンスを持っています(つまり、vector<...>)。コールバックすると、シーケンスを繰り返して呼び出します。

例えば

std::vector<std::tr1::function<void (std::string)> > callbacks; 
auto it = callbacks.begin(), end = callbacks.end(); 
for(; it != end; ++it) 
    (*it)("somestring"); 
0

リスト/ベクトルでそれらを置きます。それらを個別に削除する必要がある場合、いくつかの方法をラップする必要があります(比較可能ではないため)。

関連する問題