У меня есть механизм обратного вызова, задействованные классы:
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);
не. Я думаю, это потому, что я неправильно указываю адрес перегруженной функции.
Теперь, объяснив все это плюшевому мишке, я думаю, что мой вопрос: «Как мне правильно создать указатель функции на перегруженную или шаблонную функцию-член и привязать к ней этот указатель?»