2012. 1. 14. 05:35

인스턴스 멤버함수를 인자로 받고 호출하는 방법

C 에서는 함수 포인터를 이용하여 전역함수를 저장하고 필요시에 호출할 수 있습니다. C++ 에서도 마찬가지로 함수 포인터를 이용하지만 지금 소개할 내용은 흔히 사용되는 static 또는 전역 함수가 아닌 인스턴스 멤버 함수를 호출하는 방법에 대한 좋은 예제입니다.
(출처는 "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&ltReceiver>::Execute () 
{ 
	(_receiver->*_action)(); 
}
 
이 템플릿을 사용하는 클라이언트 코드는 다음과 같습니다.

 MyClass* receiver = new MyClass; 

// ... 
Command* aCommand = 
new SimpleCommand<MyClass>(receiver, &MyClass::Action); 

// ... 
aCommand->Execute();