2016-06-22 17 views
5

Wie kann ich statisch behaupten, dass ein Ausdruck ein std::unique_ptr ist, d. H. std::unique_ptr<T> für einen beliebigen T.static_assert für unique_ptr eines beliebigen Typs

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

Oben funktioniert nicht. Wenn nichts direkt geht, interessiert mich nur, ob für den Typ bool() Operator definiert ist.

+0

Beachten Sie, dass die besten Antworten (im Moment) auf 'std :: true_type 'und so weiter basieren. Diese sind Teil der kommenden C++ 17, und Sie müssen möglicherweise die Lösung mit der derzeit verfügbaren 'std :: integral_constant 'umschreiben – StoryTeller

+2

@StoryTeller Huh? 'std :: true_type' ist seit C++ 11 verfügbar. Sie haben es möglicherweise mit der Aliasvorlage 'std :: bool_constant' verwechselt. – cpplearner

+0

@cpplearner, Sie scheinen richtig zu sein. Ich habe es fest im Kopf behalten, dass die drei Hand in Hand gehen. Naja. – StoryTeller

Antwort

6

Erstellen Sie Ihr eigenes Merkmal, mit dem entsprechenden Teil-Spezialisierung:

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

Das obige Beispiel scheint nicht für "const" eindeutige Zeiger zu funktionieren. Zum Beispiel ist 'is_unique_ptr > :: value' falsch. – camelCase

3

Sie ein Merkmal dafür erstellen:

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

Sie diese verwenden können:

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

Grundsätzlich , was es tut, ist ein std::unique_ptr aus dem Typ von std::unique_ptr::get() erstellen, und das mit expr vergleichen. Dies ist nur dann der Fall, wenn expr eine std::unique_ptr ist.

+0

Was ist, wenn "exp" '.get' nicht implementiert? – dashesy

+0

@dashesy Dann würde es immer noch scheitern :) – Rakete1111

+0

So funktioniert es in einer Weise :) nur nicht mit der gegebenen Zusicherung Nachricht – dashesy