C 에서는 함수 포인터를 이용하여 전역함수를 저장하고 필요시에 호출할 수 있습니다. C++ 에서도 마찬가지로 함수 포인터를 이용하지만 지금 소개할 내용은 흔히 사용되는 static 또는 전역 함수가 아닌 인스턴스 멤버 함수를 호출하는 방법에 대한 좋은 예제입니다.
(출처는 "GOF : Design patterns - Elements of resuable Object-Oriented Software" 이며 Command 패턴 구현시 Subclassing 대신 Template 을 이용하는 방법에 대해서 소개하면서 나오는 내용입니다.)
virtual void Execute() 를 구현한 코드는 다음과 같습니다
이 템플릿을 사용하는 클라이언트 코드는 다음과 같습니다.
(출처는 "GOF : Design patterns - Elements of resuable Object-Oriented Software" 이며 Command 패턴 구현시 Subclassing 대신 Template 을 이용하는 방법에 대해서 소개하면서 나오는 내용입니다.)
template <class Receiver> class SimpleCommand : public Command { public: typedef void (Receiver::* Action)(); SimpleCommand(Receiver* r, Action a) : _receiver(r), _action(a) { } virtual void Execute(); private: Action _action; Receiver* _receiver; };
virtual void Execute() 를 구현한 코드는 다음과 같습니다
template <class Receiver> void SimpleCommand<Receiver>::Execute () { (_receiver->*_action)(); }
이 템플릿을 사용하는 클라이언트 코드는 다음과 같습니다.
MyClass* receiver = new MyClass; // ... Command* aCommand = new SimpleCommand<MyClass>(receiver, &MyClass::Action); // ... aCommand->Execute();