2013-08-11 2 views
0

변경을위한 템플릿 해결 방법 :이 위임 클래스를 고려 유형

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에 대해 쓴 내용을 빠르게 읽었으며, 이것이 내 문제 또는 다른 기술에 적용될 수 있는지 궁금합니다.

고맙습니다.

+1

아마 당신은'CLDelegate'에 대한 세부 사항을 말하지 않았을 것입니다 만,'std :: bind' (그리고'SomeClass'에 nulary'std :: function '의 컨테이너)를 사용하지 않을까요 – zaufi

+0

바인딩에 사용 된 정적이어야합니다 맞습니까? – Athanase

+0

s/must/may /. 의무 사항은 아닙니다. 'bind'는 호출 할 수있는 모든 엔티티를 묶을 수 있습니다. – zaufi

답변

1

std :: allocator를 보셨습니까? 그것은 std :: allocator가 컴파일 타임에 당신에게 std :: allocator를 줄 수있는 'rebind'타입을 가지고있다.

template <class DELEGATECLASS, class METHODPTRSPEC> 
class CLDelegate 
{ 
public: 
    template<class D, class M> 
    struct rebind { 
     typedef CLDelegate<D, M> type; 
    }; 

    CLDelegate(); 
    CLDelegate(DELEGATECLASS* instancePtr, METHODPTRSPEC methodPtr); 
    CLDelegate(const CLDelegate& rhs); 

    DELEGATECLASS* pInstance_; 
    METHODPTRSPEC pMethod_; 
}; 

이미 다른 CLDelegate 유형을 얻기 위해 다음 코드를 사용할 수있는 CLDelegate 유형이있는 경우이 방법.

typename MyDelType::rebind<NewDel, NewSpec>::type 

찾고 계신가요?

+0

우리가 할 일에 대해 더 많이 이야기 할 수 있다면 더 나은 길을 인도 할 수있을 것입니다. 나는 지금 당면한 이슈에 대해 다소 불확실하다. 그리고 나는이 문제에 대해 정확하게 확신하지 못한다. – Jake

+0

죄송합니다.이 작은 트릭에 대해 너무 빠져 나가서 제 문제를 올바르게 설명하는 것을 잊었습니다. 나는 남아있는 작은 것을 제외한 모든 것을 해결했다. 현재 코드를 보여줄 요지를 쓰고 있습니다. – Athanase

+0

[여기] (https://gist.github.com/athanase/6206698)가 요지입니다. 내 문제는 'del_' 멤버가 동적 객체가 아니라는 것입니다. 그래서 생성자의'del_'은 실제로는 로컬 객체입니다. 그래서 나는 초기화 목록에'rebind' 코드를 넣거나'del_'을 동적 객체로 만들어야합니다 ... 당신 의견은 무엇입니까? – Athanase