2010-05-13 27 views
17

मैं एक टेम्पलेट क्लास को परिभाषित करना चाहता हूं जिसका टेम्पलेट पैरामीटर हमेशा एक पूर्णांक प्रकार होगा। कक्षा में दो सदस्य होंगे, T टाइप करें, और दूसरा T के हस्ताक्षरित संस्करण के रूप में - यानी T == int, फिर T_Unsigned == unsigned int। मेरा पहला वृत्ति यह करना था:स्पष्ट लक्षणों के बिना एक पूर्णांक टेम्पलेट पैरामीटर के हस्ताक्षरित/हस्ताक्षरित संस्करण प्राप्त करें

template <typename T> class Range { 
    typedef unsigned T T_Unsigned; // does not compile 
public: 
    Range(T min, T_Unsigned range); 
private: 
    T m_min; 
    T_Unsigned m_range; 
}; 

लेकिन यह काम नहीं करता है। मैं तो आंशिक टेम्पलेट विशेषज्ञता का उपयोग कर, तो तरह के बारे में सोचा:

template <typename T> struct UnsignedType {}; // deliberately empty 
template <> struct UnsignedType<int> { 
    typedef unsigned int Type; 
}; 

template <typename T> class Range { 
    typedef UnsignedType<T>::Type T_Unsigned; 
    /* ... */ 
}; 

यह काम करता है, इतने लंबे समय आप आंशिक रूप से UnsignedTypeहर पूर्णांक प्रकार के लिए विशेषज्ञ के रूप में। यह अतिरिक्त कॉपी-पेस्ट काम (मैक्रोज़ का स्लैश न्यायसंगत उपयोग) का थोड़ा सा है, लेकिन सेवा योग्य है।

हालांकि, अब मैं उत्सुक हूं - क्या एक पूर्णांक प्रकार के हस्ताक्षरित-नेस को निर्धारित करने का एक और तरीका है, और/या किसी प्रकार के हस्ताक्षरित संस्करण का उपयोग करके, एक प्रकार के गुणों को मैन्युअल रूप से परिभाषित किए बिना? या यह ऐसा करने का एकमात्र तरीका है?

उत्तर

20

जवाब <type_traits>

में है एक प्रकार उपयोग एसटीडी के हस्ताक्षर किए सत्ता :: is_signed और std ::

is_unsigned जोड़ने के लिए निर्धारित करने के लिए/दूर करने पर हस्ताक्षर किए सत्ता, वहाँ std :: make_signed और std :: make_unsigned

+0

+1 "मैं इसके बारे में क्यों नहीं सोचा" जवाब के लिए +1। :) –

3

यदि आप TR1/C++ 0x सुविधाओं पर निर्भर नहीं रहना चाहते हैं, Boost.TypeTraits आपको make_unsigned<> et al भी प्रदान करता है।

+0

+1 - जैसा कि होता है मैं विजुअल स्टूडियो 2005 का उपयोग कर रहा हूं जो '' का समर्थन नहीं करता है - इसलिए एक विकल्प आसान है। मैंने अभी भी मानक लाइब्रेरी का हिस्सा होने के रूप में उत्तर के रूप में ' 'स्वीकार कर लिया है। –

+0

@ ब्लेयर: सावधान, वास्तव में * "का हिस्सा होगा" * - अगले मानक का उसका हिस्सा जो अभी तक बाहर नहीं है। –