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

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


а почему бы нет

#if !defined __ICOMMAND_H__
#define __ICOMMAND_H__

#include "../../System/Loki/Functor.h"

//////////////////////////////////////////////////////////////////////////
class ICommand
{
public:
    virtual ~ICommand() {}
    void execute() { do_execute(); }
protected:
    virtual void do_execute() = 0;
};
//////////////////////////////////////////////////////////////////////////
template<typename TClass>
class CommandHelperFuncPtr : public ICommand
{
public:
    CommandHelperFuncPtr(TClass &t, void (TClass::*pFunc)()) : t_(t), pFunc_(pFunc) {}
protected:
    virtual void do_execute()
    { (t_.*pFunc_)(); }
private:
    TClass t_;
    void (TClass::*pFunc_)();
};
//////////////////////////////////////////////////////////////////////////
// void TClass::foo();
// TClass parent_;
//    CommandHelper<TClass> e(parent_, TClass::foo);
//    e.execute();

//////////////////////////////////////////////////////////////////////////
template<typename TFunctor>
class CommandHelperPtr : public ICommand
{
public:
    CommandHelperPtr(TFunctor *pf) : tfunc_(pf) {}
    ~CommandHelperPtr() { delete tfunc_; }
protected:
    virtual void do_execute()
    { (*tfunc_)(); }
private:
    TFunctor *tfunc_;
};
//////////////////////////////////////////////////////////////////////////
template <typename TFunctor>
class CommandHelperRef: public ICommand
{
public:
    CommandHelperRef(TFunctor &pf) : tfunc_(pf) {}
protected:
    virtual void do_execute() { tfunc_(); }
private:
    TFunctor &tfunc_;
};
//////////////////////////////////////////////////////////////////////////
// Parent pnt;
// typedef Functor<void> my_func;
// my_func classFunctor(&pnt, &Parent::call_me);
// CommandFunctor<my_func> e(classFunctor);
// e.execute();
//////////////////////////////////////////////////////////////////////////
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.