2016-10-17 3 views
5

std::vector과 매우 비슷한 것을 구현하지만 메모리 할당 대신 스택에 배열을 사용합니다.sfinae away a destructor

dtor는 SFINAE를 사용하는 함수를 호출합니다.

  • value_type이 공백 인 경우 함수에 빈 몸체가 있습니다.
  • value_type이 정상 클래스 인 std::string 인 경우 함수에 본문이 있고 모든 데이터가 제대로 삭제됩니다.

이제이 새로운 std::vectorconstexpr으로 사용하고 싶습니다. 그러나 C-tor도 constexpr으로 선언되었지만 클래스에 평범하지 않은 코드가 있으므로 코드가 컴파일되지 않습니다.

template<typename T, std::size_t SIZE> 
class SmallVector{ 
    constexpr SmallVector() = default; 

    ~SmallVector(){ 
     destructAll_<value_type>(); 
    } 

    // ... 

    template<typename X> 
    typename std::enable_if<std::is_trivially_destructible<X>::value == true>::type 
    destructAll_() noexcept{ 
    } 

}; 

내가 클래스 value_type는 POD 및 비 POD 데이터 유형에 대한 유지 기능입니다 constexpr 경우가 될 수 있도록 할 수 있나요 :

여기에 코드의 작은 부분이다.
(물론 동시에는 아님)

+2

. 둘 사이의 유일한 차이점은 소멸자입니다. – DeiDei

+0

내 생각은 비슷하다. 하나의 읽기 전용 기본 클래스와 두 개의 상속 된 버전의 모든 변형 메소드. 세 번째 템플릿 인 "구성 요소"가 어떻게 도움이되는지 알지 못하기 때문에 pls가 아이디어에 대한 답을 줄 수 있습니까? 두 가지 기본 클래스를 상속 받는다는 의미입니까? – Nick

+0

'std :: vector'와 얼마나 비슷한가, 그런 타입이 될 수 있습니까? 오히려'std :: array'를 다시 구현하고 있습니까? Orrrr은 거대한 자동 스토리지 어레이를 갖춘 벡터이며 배치가 새로 추가 되었습니까? :) –

답변

5

불행히도 SFINAE 또는 향후 개념을 사용하여 소멸자를 활성화/비활성화 할 수있는 방법은 없습니다. 즉 때문에 destructos :

  • 는 반환 유형을 가질 수 없습니다 인수를 가질 수 없습니다 템플릿 수 없습니다

할 수있는 일이, 전체 클래스를 전문으로하거나 더 나은 방법으로, 생성/소멸 및 기본 액세스 만 포함하는 기본 클래스를 만들고이를 특수화하십시오. 내가 대신 주요 정의와 하찮게 파괴 유형에 대한 전문성이있을 것이다 'SmallVectorImpl :: 값>'에서 상속 할

template <class T, class Enable = void> 
struct X { 
    ~X() {} 
}; 

template <class T> 
struct X<T, std::enable_if_t<std::is_pod<T>::value>> { 
}; 

static_assert(std::is_trivially_destructible<X<int>>::value); 
static_assert(!std::is_trivially_destructible<X<std::vector<int>>>::value);