2012-06-26 2 views
0

boost :: shared_ptr에 저장된 기본 유형과 포인터 유형을 모두 사용하는 C++ 템플릿 라이브러리를 개발 중입니다. 라이브러리의 하위 레이어로 전달되기 전에 필요한 경우 기본 유형을 컨테이너 클래스에 압축하는 데 사용되는 도우미 클래스에 문제가 있습니다. 다음은 포인터를 전달하는 기본 유형과 기본 요소 중 하나 인 std :: string에 대한 구현을 보여줍니다.boost :: shared_ptr을 템플릿 매개 변수에서 제거하십시오.

template <class T> class RRPrimUtil 
{ 
public: 
    static rr_DataType GetTypeID() {return rr_void_t;} 


    static boost::shared_ptr<RRObject> PrePack(T val)  {return rr_cast<RRObject>(val);} 

    static T PreUnpack(boost::shared_ptr<RRObject> val) {return rr_cast<T>(val);} 
}; 

template<> class RRPrimUtil<std::string> 
{ 
public: 
    static rr_DataType GetTypeID() {return rr_string_t;} 
    static boost::shared_ptr<RRObject> PrePack(std::string val) {return rr_cast<RRObject>(stringToRRArray(val));} 
    static std::string PreUnpack(boost::shared_ptr<RRObject> val) {return RRArrayToString(rr_cast<RRArray<char>>(val));} 

}; 

rr_cast <는>() 함수 dynamic_pointer_cast 별칭이다. 내가 겪고있는 문제는 일반적인 경우에 템플릿 "T"에 "boost :: shared_ptr"접두사가 있기 때문입니다.이 유형은 shared_ptr과 상호 작용할 수도 있고 사용하지 않을 수도 있기 때문입니다. 접두사는 단지 포인터 유형을 기대하기 때문에 dynamic_pointer_cast를 엉망으로 만든다. 이 문제를 해결할 수있는 확실한 방법이 있습니까?

답변

3

템플릿의 metafunction는 당신을 위해 스트립 것입니다

전달 된 유형이 T*를 반환 형태 boost::shared_ptr<T> 인 경우
template<typename T> struct primitive_type 
{ 
    typename T type; 
}; 

template<typename T> struct primitive_type< boost::shared_ptr<T> > 
{ 
    typename T* type; 
}; 

; 그렇지 않으면 인스턴스화 된 유형을 리턴합니다.

+0

감사합니다. 문제가 해결되었습니다. – John

관련 문제