Здравствуйте, Снорк, Вы писали:
С>Можно ли в 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();
//////////////////////////////////////////////////////////////////////////