2016-06-22 15 views
5

W jaki sposób mogę statycznie potwierdzić, że wyrażenie jest std::unique_ptr, tj. std::unique_ptr<T> dla każdego .static_assert dla unique_ptr dowolnego typu

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

Powyżej nie działa. Jeśli nic prostego, interesuje mnie tylko operator bool() zdefiniowany dla tego typu.

+0

Należy pamiętać, że najlepsze odpowiedzi (w tej chwili) polegać na 'std :: true_type' i takie. Są one częścią nadchodzącego C++ 17 i może zajść potrzeba przepisania rozwiązania za pomocą aktualnie dostępnego 'std :: integral_constant' – StoryTeller

+2

@StoryTeller Huh? 'std :: true_type' jest dostępny od wersji C++ 11. Mogłeś pomylić go z szablonem aliasu 'std :: bool_constant'. – cpplearner

+0

@cpplearner, wydajesz się być poprawny. Utknąłem w głowie, że te trzy idą ręka w rękę. No cóż. – StoryTeller

Odpowiedz

6

Stwórz własną cechę, przy odpowiedniej specjalizacji częściowej:

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

Powyższy przykład nie działa dla unikalnych wskaźników "const". Na przykład 'is_unique_ptr > :: value' ma wartość false. – camelCase

3

Można utworzyć cechę na to:

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)); 
1

można użyć tego:

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

Zasadniczo , co robi, to tworzenie std::unique_ptr z typu z std::unique_ptr::get(), i porównując to z expr. To będzie zawsze prawdziwe, jeśli expr jest .

+0

co jeśli 'exp' nie implementuje' .get'? – dashesy

+0

@dashy Wtedy to by się nie powiodło :) – Rakete1111

+0

Działa to w pewien sposób :) tylko nie z danym komunikatem potwierdzenia – dashesy

Powiązane problemy