2014-10-24 2 views
3

MyBaseClass에서 파생 된 모든 객체에 대해 default_delete < _Ty>을 전문으로하고 싶습니다.default_delete의 부분 특수화

template <typename T> 
struct default_delete<typename enable_if<is_base_of<MyBaseClass, T>::value, T>::true_type> 
{ 
    ... 
}; 

컴파일러는 내 타입 매개 변수 'T'가 사용되고 있음을 인식 할 수없는 것, 그것은 '유형 이름'키워드에서 '다운 스트림'이라고 주어진 이해할 수있다 : 이것은 나의 가장 좋은 시도였다. 내가 성취하려고하는 것이 가능한가?

+0

오류를 게시하고 (오류가있는 것이 가장 바람직 함) 게시하십시오. – Oguk

+1

매개 변수 선언이 평가되지 않은 상황입니다 (즉, 'T'는 주어진 매개 변수에서 추론 할 수 없음). 'default_delete'는 SFINAE 타입 표현식을 허용하는 추가 매개 변수를 가져야합니다. 그렇지 않으면 불가능합니다 (AFAIK). 또는 자체 삭제자를 구현할 수도 있습니다. – 0x499602D2

+0

'enable_if :: value, T> :: type'이 아니겠습니까? – Pradhan

답변

3

주석에서 0x499602D2는 상태가 추가 전용 템플릿 매개 변수 없이는 가능하지 않습니다. 다음과 같이 자신의 Deleter를 사용할 수 있습니다.

template <typename T, typename Enable = void> 
struct my_default_delete : public std::default_delete<T> {}; // default to std::default_delete<T> 

template <typename T> 
struct my_default_delete<T, typename std::enable_if<std::is_base_of<MyBaseClass, T>::value>::type> 
{ 
    void operator() (T*) { /* Your specific implementation */ } 
}; 
+0

여기서 문제는 deleter가 더 이상 '기본'Deleter가 아니라는 것입니다. 즉,이 deleter를 수동으로 지정해야합니다 : unique_ptr > – yxrkt

+0

@yxrkt : 추가 레이어를 추가 할 수 있습니다 : my_unique_ptr = std :: template을 사용하여 템플릿 > unique_ptr , ' – Jarod42

+0

템플릿 앨리어싱이 훌륭하지만 프로젝트에서 vs2012 :( – yxrkt