자신 만의 클래스를 만들어서 부스트 바인딩 함수와 동일한 작업을 수행 할 수 있습니다. 모든 클래스는 함수 유형과 함수를 포함하는 객체에 대한 포인터를 허용해야합니다.
이
template<typename owner>
class VoidDelegate : public IDelegate
{
public:
VoidDelegate(void (owner::*aFunc)(void), owner* aOwner)
{
mFunction = aFunc;
mOwner = aOwner;
}
~VoidDelegate(void)
{}
void Invoke(void)
{
if(mFunction != 0)
{
(mOwner->*mFunction)();
}
}
private:
void (owner::*mFunction)(void);
owner* mOwner;
};
사용법 : 예를 들어, 다음은 무효 반환 및 무효 PARAM 위임이다 VoidDelegate<C>
는 타입이기 때문에
class C
{
void CallMe(void)
{
std::cout << "called";
}
};
int main(int aArgc, char** aArgv)
{
C c;
VoidDelegate<C> delegate(&C::CallMe, &c);
delegate.Invoke();
}
이제, 이들의 컬렉션을 가진 것은 실용적이지 않을 수는, 만약에 있기 때문에 목록에는 클래스 B의 함수도 포함되어 있었습니까? 그것은 할 수 없었다.
여기에는 다형성이 작용합니다. 당신은 함수 호출이있는 인터페이스 IDelegate를 만들 수 있습니다 :
class IDelegate
{
virtual ~IDelegate(void) { }
virtual void Invoke(void) = 0;
}
VoidDelegate<T>
만약 구현하면 IDelegates의 컬렉션이 때문에 다른 클래스 유형에 방법에 콜백을 가질 수 IDelegate.
는 유망 해 보입니다. 사용을 게시 할 수 있습니까? –
아쉽게도 멤버 함수 호출을 다른 것으로 대체하는 것입니다. – Eclipse
수정하십시오. 이를 외부 다형성 (external polymorphism)이라고합니다.기본적으로 멤버 함수를 객체에 전달하고이 객체를 전달한 다음 나중에 설정 한 클래스에서 호출 할 수 있습니다. 이벤트에 아주 좋습니다! 이것은 C#의 델리게이트와 같습니다. – Chap