변경을위한 템플릿 해결 방법 :이 위임 클래스를 고려 유형
template <class DELEGATECLASS, class METHODPTRSPEC>
class CLDelegate
{
public:
CLDelegate();
CLDelegate(DELEGATECLASS* instancePtr, METHODPTRSPEC methodPtr);
CLDelegate(const CLDelegate& rhs);
DELEGATECLASS* pInstance_;
METHODPTRSPEC pMethod_;
};
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate()
: pInstance_(nullptr)
, pMethod_(nullptr)
{}
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate(DELEGATECLASS*
instancePtr, METHODPTRSPEC methodPtr)
: pInstance_(instancePtr)
, pMethod_(methodPtr)
{}
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate(const CLDelegate& rhs)
: pInstance_(rhs.pInstance_)
, pMethod_(rhs.pMethod_)
{}
내가 다른 클래스 내에서이 대리자를 사용하고 싶습니다,하지만 난 내가하는 모든 클래스의 템플릿 매개 변수를해야 할 것입니다 하지 다음과 같이합니다 :
template<class DELEGATECLASS, class METHODPTR>
class SomeClass
{
public:
IOVFUCam();
~IOVFUCam();
// Data Members
private:
...
const CLDelegate<DELEGATECLASS, METHODPTR>& del_;
};
을 나는 내 클래스의 더미 대리자를 가지고 유형을 변경할 수 있습니다 궁금 전체 클래스에 템플릿 매개 변수를 사용하지 않기 때문에 (컴파일시에?) :
struct EmptyType
{};
class SomeClass
{
public:
template<class DELEGATECLASS, class METHODPTR>
IOVFUCam(CLDelegate<DELEGATECLASS, METHODPTR> del)
: del_(del)
{};
~IOVFUCam();
// Data Members
private:
...
const CLDelegate<EmptyType, EmptyType>& del_;
};
FrameHandler handler;
CLDelegate<FrameHandler,
void(FrameHandler::*)(IOBuffer::Ptr)>
del(&handler, &FrameHandler::ProcessImage);
SomeClass obj(del);
Alexandrescu가 TypeTraits에 대해 쓴 내용을 빠르게 읽었으며, 이것이 내 문제 또는 다른 기술에 적용될 수 있는지 궁금합니다.
고맙습니다.
아마 당신은'CLDelegate'에 대한 세부 사항을 말하지 않았을 것입니다 만,'std :: bind' (그리고'SomeClass'에 nulary'std :: function'의 컨테이너)를 사용하지 않을까요 –
zaufi
바인딩에 사용 된 정적이어야합니다 맞습니까? – Athanase
s/must/may /. 의무 사항은 아닙니다. 'bind'는 호출 할 수있는 모든 엔티티를 묶을 수 있습니다. – zaufi