2017-06-24 11 views
7

के लिए std :: numeric :: प्रकार के विशेषज्ञता का पता लगाने के लिए मैं यह देखना चाहता हूं कि किसी प्रकार के std :: numeric_limits में कोई प्रविष्टि है या नहीं। जब प्रकार एक सरणी है - (या शायद कोई संख्या नहीं?) मुझे एक कंपाइलर त्रुटि मिलती है। यह मुझे std :: numeric_limits में समर्थित है या नहीं, इस आधार पर मुझे पता लगाने और ब्रांचिंग से रोकता है। मैं किसी भी अंतर्दृष्टि की सराहना करता हूं जो कोई भी साझा करना चाहता है। कुछ गैर संख्यात्मक प्रकार टी

// the following provokes compiler error on Clang 
// Function cannot return array type 'type' (aka 'char [20]') 
static_assert(
    ! std::numeric_limits<char[20]>::is_specialized, 
    "! std::numeric_limits<char[20]>::is_specialized" 
); 
// invokes static assert on compile as expected 
static_assert(
    std::numeric_limits<char[20]>::is_specialized, 
    "std::numeric_limits<char[20]>::is_specialized" 
); 
+1

पर गलती से कॉल करना नहीं चाहते हैं, तो क्या आप एक उदाहरण दे सकते हैं कि आप "पहचान और शाखा" कैसे चाहते हैं? मैं 'char [20]' जैसे निश्चित प्रकार के बजाय टेम्पलेट के अंदर कुछ अनुमान लगा रहा हूं, जिसके लिए हम सभी को जवाब पता है? – aschepler

+1

"पहचान और शाखाकरण" को परिभाषित करें। 'Static_assert' का उद्देश्य वास्तव में, संकलन विफल होने पर संकलन त्रुटि जारी करना है। यदि आपको एक अलग परिणाम की आवश्यकता है, तो आपको यह बताना होगा कि यह क्या है। –

उत्तर

2

यह इसलिए होता है क्योंकि अगर आप std::numeric_limits अंदर एक बार देख ले या दस्तावेज पर एक नज़र डालें तो आपको निम्न

template<class T> 
class numeric_limits 
{ 
public: 
    static constexpr bool is_specialized = false; 
    static constexpr T min() noexcept; 
    static constexpr T max() noexcept; 
    static constexpr T lowest() noexcept; 

तरह के तरीकों की घोषणाओं देखेंगे यहाँ के रूप में आप वहाँ कार्यों कि वापसी कर रहे हैं देख सकते हैं T मूल्य से, और सी ++ मूल्य द्वारा सरणी प्रकार लौटने का समर्थन नहीं करता (Why doesn't C++ support functions returning arrays? देखें)

तो निम्न पंक्ति

संकलन नहीं होगा
std::numeric_limits<char[20]>::is_specialized 

और उस के तत्काल संदर्भ में नहीं है सीधे जाँच करने के लिए है कि क्या SFINAE साथ सीधे एक प्रकार के लिए काम करता है is_specialized संकलन नहीं होगा क्योंकि वहाँ (क्योंकि सरणी प्रकार लौटने जैसा कि ऊपर बताया की) का उत्पादन एक त्रुटि हो जाएगा किसी भी आगे प्रयास नमूना। तो अगर आप अवधारणा है कि std::numeric_limits के लिए समर्थित है का निरीक्षण करने की आवश्यकता होगी (इस मामले में std::is_arithmetic)

हालांकि सभी आप इस काम std::decay_t प्रकार

std::numeric_limits<std::decay_t<char[20]>>::is_specialized 

है बनाने के लिए यहाँ क्या करने की जरूरत और अब यह होगा काम करें क्योंकि आपने स्पष्ट रूप से सरणी प्रकार को पॉइंटर में क्षीण कर दिया है और यह फ़ंक्शन से वापस करने योग्य है। आप संभवतः पहले स्थान पर ऐसा करना चाहते थे क्योंकि आप को गैर-क्षय प्रकार के लिए const int&

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