2014-03-06 2 views
4

한다고 가정 할 특성을 나는 다음과 같은 템플릿이 있습니다 때문에이 소멸자의 부분 템플릿 특수화는

template <typename T> union example { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 

    /* We rely on owning class to take care 
    * of destructing the active member */ 
    ~example() {}; 
}; 

example<T>이 하찮게 파괴 없을 것 (예를 들어, 이렇게하지, 리터럴 유형). 내가 경고 (가늠자에, 합리적인) T이지만, 불행하게도 그 날에게 제공 할 때 example<T>이 하찮게 파괴 될 수 있도록

template <typename T> union 
    example<std::enable_if_t<std::is_trivially_destructible<T>::value, T>> { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 
}; 

같은 부분 전문성을 가지고 같은 을 거라고

경고 : 클래스 템플릿 부분 전문화에는 추론 할 수없는 템플릿 매개 변수가 포함되어 있습니다. 이 부분 전문화는 결코 사용되지 않을 것입니다

그래서 내가 원하는 것을 얻을 수있는 방법이 있습니까?

+0

왜 명시 적으로 dtor를 써야합니까? 그럴 수 없습니까? (또는 암시 적 정의가 삭제되면 가능하지 않습니까?) – dyp

+0

아아, '= default'는 적어도'clang 3.4 '에서'T '가 사소한 파괴적이지 않으면 삭제 된 소멸자를 설정합니다. –

+1

@dyp : 그것은 노조에는 의미가 없습니다. 9.5/2 참조 : 소멸자는 사용자가 제공해야합니다. –

답변

6

두 번째 기본 템플릿 매개 변수가 있습니까?

#include <type_traits> 
#include <iostream> 

template <typename T, bool = std::is_trivially_destructible<T>::value> 
union example { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 

    /* We rely on owning class to take care 
    * of destructing the active member */ 
    ~example() { std::cout << "primary template\n"; } 
}; 

template<typename T> 
union example<T, true> { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 
}; 


struct nontrivial 
{ 
    ~nontrivial() { std::cout << "woot!\n"; } 
}; 

int main() 
{ 
    example<nontrivial> e1{{}}; 
    example<int> e2{{}}; 
} 
+0

완벽한, 감사합니다! –