2016-06-22 9 views
5

मैं स्थिर रूप से यह कह सकता हूं कि एक अभिव्यक्ति std::unique_ptr यानी std::unique_ptr<T> किसी भी T के लिए है।किसी भी प्रकार के अद्वितीय_ptr के लिए static_assert

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

ऊपर काम नहीं करता है। अगर कुछ भी आगे नहीं है, तो मुझे केवल दिलचस्पी है अगर bool() ऑपरेटर को प्रकार के लिए परिभाषित किया गया है।

+0

ध्यान रखें कि सर्वोत्तम उत्तर (फिलहाल) 'std :: true_type' पर निर्भर हैं। वे आगामी सी ++ 17 का हिस्सा हैं, और आपको वर्तमान में उपलब्ध 'std :: integral_constant' – StoryTeller

+2

@StoryTeller Huh का उपयोग करके समाधान को फिर से लिखना पड़ सकता है? 'std :: true_type' C++ 11 के बाद उपलब्ध है। आपने इसे 'std :: bool_constant' उपनाम टेम्पलेट से भ्रमित कर दिया होगा। – cpplearner

+0

@cpplearner, आपको सही लगता है। मैं इसे अपने दिमाग में फंस गया कि तीन हाथ हाथ में हैं। ओह अच्छा। – 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' गलत है। – 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

संबंधित मुद्दे