Boost:: bind & boost:: указатели функций для перегруженных или шаблонных функций-членов

У меня есть механизм обратного вызова, связанные классы:

class App
{
    void onEvent(const MyEvent& event);
    void onEvent(const MyOtherEvent& event);

    Connector connect;
}

class Connector
{  
   template <class T> void Subscribe(boost::function <void (const T&)> callback);
}

App::App()
{
    connect.Subscribe<MyEvent>(&App::OnEvent<MyEvent>);
}

Сначала этот код не компилируется, это иллюстрация.

Использование шаблонов усложняет мой пример, но я оставил их, потому что это повлияло на мою проблему. Мне кажется, что моя подписка нуждается в шаблоне, потому что класс Connector не знает, сколько типов событий он обрабатывает. Когда я пытаюсь создать:

boost::function f = &App::OnEvent, 

Я попытался создать OnEvent в качестве функции шаблона со специализациями, но похоже, что компилятор обрабатывает мои функции OnEvent как перегрузки, а не специализированные шаблоны, иначе я получаю специализацию шаблона не в ошибке пространства имен, если я попытаюсь явно объявить это как

template <> OnEvent(const MyEvent& e) ...

Я могу получить следующее для компиляции:

boost::function <void (App*, const MyEvent&)> f = &App::OnEvent;
f(this, e); 

Это компилирует, запускает и работает.

boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this);

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

Теперь, объяснив все это плюшевому медведю, я думаю, что мой вопрос: "Как правильно создать указатель функции на перегруженную или шаблонную функцию-член и связать с ней этот указатель?"

Ответы

Ответ 1

Я думаю, вам нужно устранить адрес перегруженной функции. Вы можете сделать это, явно наведя указатель на функцию с правильными параметрами.

boost::bind( static_cast<void (App::*)( MyEvent& )>(&App::OnEvent) , this, _1);

Аналогичная проблема + решение на gamedev.net

Ответ 2

Вы захотите сделать

boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);

Вы должны уметь делать g (событие); с этим

Я не совсем уверен, что вы пытаетесь сделать здесь, но это должно решить одну из ваших проблем на данный момент.