2013-02-03 32 views
16

सी ++ 11 दो प्रकार की विशेषता टेम्पलेट कक्षाएं प्रदान करता है: std::is_integer और std::is_integral। हालांकि, मैं उनके बीच मतभेद नहीं बता सकता।std :: is_integer और std :: is_integral के बीच अंतर?

टी टाइप करें, std::is_integer<T>::value सच कहां बना सकते हैं और std::is_integral<T>::value गलत बना सकते हैं?

उत्तर

18

std::is_integer<T> मौजूद नहीं है।

कहा जा रहा है कि, std::numeric_limits<T>::is_integer मौजूद है।

मुझे std::numeric_limits<T>::is_integer और std::is_integral<T> के बीच किसी भी महत्वपूर्ण अंतर के बारे में पता नहीं है। उत्तरार्द्ध बहुत बाद में डिजाइन किया गया था और सी ++ 11 में मानक बन गया, जबकि पूर्व सी ++ 98 में पेश किया गया था।

+1

मुझे प्रश्न का कोई जवाब नहीं दिख रहा है। – Raffi

9

कोई प्रकार T है जिसमें std::is_integral<T>::value और std::numeric_limits<T>::is_integer के लिए अलग-अलग परिणाम हैं। draft Standard के शब्दों में:

3.9.1 मौलिक प्रकार [basic.fundamental]

7 प्रकार bool, चार, char16_t, char32_t, wchar_t, और हस्ताक्षर किए और अहस्ताक्षरित पूर्णांक प्रकार सामूहिक रूप से कहा जाता है अभिन्न प्रकार। अभिन्न प्रकार के लिए एक पर्याय पूर्णांक प्रकार है। [...]

18.3.2.4 numeric_limits सदस्यों [numeric.limits.members]

static constexpr bool is_integer; 

17 यह सच है प्रकार है अगर पूर्णांक।

20.9.4.1 प्राथमिक प्रकार श्रेणियों [meta.unary.cat] (तालिका 47)

template <class T> struct is_integral; 

टी एक अभिन्न प्रकार (3.9.1)

1

है अंतर यह है कि std::is_integral<T> केवल boolcharchar16_tchar32_t सहित दशमलव पूर्णांक को पहचानेंगे wchar_tshortintlonglong long। जबकि std::numeric_limits<T>::is_integer उन सभी को पहचान देगा, साथ ही floatdouble। अधिक जानकारी के लिए इन दो पृष्ठों को देखें: is_integer, is_integral

0

std::is_integral_v<T> केवल अंतर्निर्मित पूर्णांक के लिए सत्य लौटाएगा।

मानक std::numeric_limits<T>::is_integer को विशिष्ट होने के लिए अनुमति देता है और boost::multiprecion::cpp_int जैसे कस्टम अभिन्न प्रकारों के लिए सत्य लौटाता है।