私のゲームのイベントシステムを作成しようとしています。私のイベントマネージャーが保存するコールバックは、単純関数とファンクターの両方になります。私はまた、関数/ファンクタを比較できるようにする必要があるので、どのイベントマネージャをイベントマネージャから切断する必要があるのか分かります。メッセージングシステム:コールバックは何でもかまいません
•最初はboost :: functionを試しました。関数とファンクタは完全にうまく処理されますが、演算子==がないことを除けば、コールバックを削除することはできません。
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
==私はまた、::ブーストを使用して信号を試してみましたが、それはまた、私のオペレータに関連したコンパイルの問題を与えます。「==」バイナリ
:なし演算子は左をとる見つかりません-handタイプのオペランド「のconstのFunctor」(あるいは全く許容可能な変換はありません)
void test(int c) {
std::cout << "test(" << c << ")";
}
struct Functor
{
void operator()(int g) {
std::cout << "Functor::operator(" << g << ")";
}
};
int main()
{
boost::signal<void (int)> sig;
Functor f;
sig.connect(test);
sig.connect(f);
sig(7);
sig.disconnect(f); // Error
}
私はこれを実装する方法をについての他の提案?あるいは、私はboost :: functionまたはboost :: signalのどちらを使うことができるのでしょうか?これは私がEventManagerが欲しいというのインタフェースである:
編集(。私は信号を聞いたので、私はむしろ、アイテムの小さなコレクションのかなり遅いです、しかしブースト::機能を使用すると思います)持つ。
class EventManager
{
public:
void addEventHandler(Event::Type evType, Callback func);
void removeEventHandler(Event::Type evType, Callback func);
void queueEvent(boost::shared_ptr<Event> ev);
void dispatchNextEvent();
};
@bdonlan信号例のものは[boost :: function_equal](http://www.boost.org/doc/libs/1_47_0/doc/html/boost/function_equal.html)です。 –
sorta dup:http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects – stijn