2016-06-22 3 views
5

어떤 표현식이 std::unique_ptr (의 경우 std::unique_ptr<T>)이라고 정적으로 주장 할 수 있습니까?모든 유형의 unique_ptr에 대한 static_assert

static_assert (std::is_pointer<decltype(exp)>()), "not a smart pointer") 

위의 코드는 작동하지 않습니다. 똑바로 서두르지 않으면 형식에 대해 bool() 연산자가 정의 된 경우에만 관심이 있습니다.

+0

최상의 답변 (현재로서는)은'std :: true_type' 등에 의존한다는 것을 알아 두십시오. 그것들은 다가오는 C++ 17의 일부이며 현재 사용할 수있는'std :: integral_constant'를 사용하여 솔루션을 다시 작성해야 할 수도 있습니다 – StoryTeller

+2

@StoryTeller 허? 'std :: true_type'는 C++ 11부터 사용할 수 있습니다. 'std :: bool_constant' 별칭 템플릿과 혼동했을 수도 있습니다. – cpplearner

+0

@cpplearner, 당신은 옳은 것 같습니다. 나는 3 명이 손을 잡았다는 사실을 마음에 새기고있다. 오 잘. – StoryTeller

답변

6

해당 부분 특수화와 함께, 자신의 특성을 만들기 : 기본적으로

static_assert(std::is_same<decltype(expr), 
    std::unique_ptr<std::remove_pointer<decltype(expr.get())>::type>>::value, ""); 

:

template <typename T, typename D> 
std::true_type is_unique_ptr_impl(const std::unique_ptr<T, D>&, int); 

template <typename T> 
std::false_type is_unique_ptr_impl(const T&, ...); 

template <typename T> 
using is_unique_ptr = decltype(is_unique_ptr_impl(std::declval<T>(), 0)); 
+0

위 예제는'const' 고유 포인터에 대해 작동하지 않는 것 같습니다. 예를 들어,'is_unique_ptr > :: value'는 false입니다. – camelCase

3

당신은 그에 대한 특성을 만들 수 있습니다 , 무엇이 std::unique_ptr::get()에서 형식 중 std::unique_ptr을 만들고, 이를 expr과 비교합니다. exprstd::unique_ptr 인 경우에만 적용됩니다.

1

당신은이를 사용할 수 있습니다

template <class T> 
struct is_unique_ptr : std::false_type 
{}; 

template <class T, class D> 
struct is_unique_ptr<std::unique_ptr<T, D>> : std::true_type 
{}; 
+0

'exp '가'.get'을 구현하지 않는다면 어떨까요? – dashesy

+0

@dashesy 그렇다면 여전히 실패합니다 :) – Rakete1111

+0

그래서 그것은 주어진 어설 션 메시지로만 작동합니다 :) – dashesy

관련 문제