(C ++ 0x), но это не похоже на сравнение, поэтому оно не будет работать с кодом, который я выложил выше.

аюсь написать систему событий для моей игры. Обратные вызовы, которые будет хранить мой менеджер событий, могут быть как обычными функциями, так и функторами. Мне также нужно иметь возможность сравнивать функции / функторы, чтобы я знал, какую из них мне нужно отключить от менеджера событий.

• Изначально я пытался использовать boost :: function; он отлично обрабатывает функции и функторы, за исключением того, что у него нет оператора ==, поэтому я не могу удалить обратные вызовы, если захочу.

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 :: Function или Boost :: Signal работать? (Я бы предпочел использовать boost :: function, так как я слышал, что для небольших коллекций элементов сигнал довольно медленный.)

Редактировать: Это интерфейс, который я бы хотел иметь в 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();
};

Ответы на вопрос(4)

Ваш ответ на вопрос