Как лучше передать Callback в объект?

Есть реализация GUI на чистом C++03 без STL, Boost. В нем есть иерархия окно->элемент->...->элемент. Одним из элементов GUI является Button. В нее приходят события OnTapDown и иже с ними.


Первым вариантом организовать Callback был указатель на функцию. Недостаток — невозможно передать функцию класса. Приходилось городить кучу статических методов, да еще и сохранять указатель на объект класса-обработчика.


Вторым вариантом (так и не реализованным) были интерфейсы с нужными функциями. Но тогда пришлось бы городить объекты для обработки каждой из кнопок.


Третий вариант сейчас уже реализованный — передача функтора, содержащего указатель на объект и указатель на фунцию класса. Пример:

typedef BaseFunctor<void, const iPoint&> ButtonCallBackFunctor

mSomeButton->SetOnTap(ButtonCallBackFunctor::Create(this, &SomeClass::SomeClassFunction));


Причем сам функтор реализован автором на шаблонах — весьма тяжелый код получился для понимания.


Есть ли идеи, как это можно сделать лучше?
  • Вопрос задан
  • 5154 просмотра
Пригласить эксперта
Ответы на вопрос 5
Talyutin
@Talyutin
Вместо собственной реализации функтора используйте boost::function
www.boost.org/doc/libs/1_52_0/libs/bind/bind.html#with_boost_function
Ответ написан
Talyutin
@Talyutin
В C++0x уже есть, какая у вас версия компилятора?
Новый C++ да еще и без stl — жестко…
Ответ написан
mejedi
@mejedi
Третий вариант сейчас уже реализованный — передача функтора, содержащего указатель на объект и указатель на фунцию класса.

Нормальный вариант.
Ответ написан
@leclecovich
Для своих нужд сделал следующим образом: добавил интерфейс ICallable с единственным методом onlyOneMethod(). В метод, который производит вызов callback-метода, в качестве аргументов передаю указатель на класс, реализующий ICallable, а также указатель на реализуемый метод интерфейса. Выглядит это примерно так:

void invokeCallback(void (ICallable::* pMethodPointer)(), ICallable *pInstance)
{
(pCalleeInstance->*pMethodPointer)();
}

Вызов invokeCallback выглядит так:

ICallable *pImpl = new CallableImplementationClass();
invokeCallback(&ICallable::onlyOneMethod, pImpl);

В результате, имеем возможность callback-вызова метода экземплярного класса.
Ответ написан
nephrael
@nephrael
Посмотрите в сторону библиотеки Poco:
в частности на реализацию ивентов
(начните с Firing events, последняя тема в документе )
pocoproject.org/slides/090-NotificationsEvents.pdf
к тому же код она портированна на Андройд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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