Re: EventHandler
От: addword Украина  
Дата: 06.08.03 07:45
Оценка: 6 (1)
Здравствуйте, Снорк, Вы писали:

С>Можно ли в C++ передать в шаблон не только имя типа, но и имя метода?


С>Вот исходник, который по понятным причинам не работает:


С>
С>template<class T, class M> class CRN
С>{
С>public:
С>    CRN(T* pObject)
С>    {
С>        m_pObject = pObject;
С>    }

С>    void Notify()
С>    {
С>        m_pObject->M();
С>    }

С>protected:

С>    T*        m_pObject;
С>};
С>


С>Планировалось его использовать следующим образом:


С>
С>class C {
С>...
С>void SetEventHandler(CRN* pHandler);
С>...
С>void OnEvent()
С>{
С>    pHandler->Notify();
С>}
С>};

С>void Lalamba(C* p, Object* pObject)
С>{
    p->>SetEventHandler(new CRN<Object, Method>(pObject))
С>}
С>


С>Что приводило бы к вызову метода Method у экземпляра, указуемого p.


С>Как можно решить эту проблему в общем случае?


В данном случае необходимо реализовать так называемые замыкания (closure), типа как в Builder или Delphi.
Задавать в качестве параметра шаблона имя метода нельзя. Вообще параметром шаблона может быть только константное выражение — имя типа, константа простого типа.
Необходимо использовать указатель на метод класса.
Эту задачу можно решить при помощи обобщённого функтора из шаблонной библиотеки Александреску "Loki". Его функторы позволяют реализовать замыкания (по крайней мере он так пишет в своей книге).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.