повышение:: свяжите и повысьте:: указатели функции к перегруженным или шаблонным функциям членства

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

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>);
}

Прежде всего этот код не компилирует, это - иллюстрация.

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

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);

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

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

14
задан swarfrat 16 December 2009 в 16:32
поделиться

2 ответа

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

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

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

32
ответ дан 1 December 2019 в 07:27
поделиться

Вы собираетесь сделать

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

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

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

4
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: