ゲームのイベント システムを作成しようとしています。イベント マネージャーが格納するコールバックは、単純な関数とファンクターの両方にすることができます。また、関数/ファンクターを比較できるようにする必要があるため、イベントマネージャーから切断する必要があるものを知ることができます。
• 最初は boost::function; を使用してみました。operator== がないことを除いて、関数とファンクターを完全に適切に処理するため、必要に応じてコールバックを削除することはできません。
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
• boost::signal も使用してみましたが、operator== に関連するコンパイルの問題も発生します。
バイナリ '==' : '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:: 関数または boost::signal を機能させるにはどうすればよいでしょうか。(ただし、アイテムの小さなコレクションでは信号がかなり遅いと聞いたので、boost:: 関数を使用したいと思います。)
編集:これは、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();
};