मैं एक टेम्पलेट क्लास को परिभाषित करना चाहता हूं जिसका टेम्पलेट पैरामीटर हमेशा एक पूर्णांक प्रकार होगा। कक्षा में दो सदस्य होंगे, 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
हर पूर्णांक प्रकार के लिए विशेषज्ञ के रूप में। यह अतिरिक्त कॉपी-पेस्ट काम (मैक्रोज़ का स्लैश न्यायसंगत उपयोग) का थोड़ा सा है, लेकिन सेवा योग्य है।
हालांकि, अब मैं उत्सुक हूं - क्या एक पूर्णांक प्रकार के हस्ताक्षरित-नेस को निर्धारित करने का एक और तरीका है, और/या किसी प्रकार के हस्ताक्षरित संस्करण का उपयोग करके, एक प्रकार के गुणों को मैन्युअल रूप से परिभाषित किए बिना? या यह ऐसा करने का एकमात्र तरीका है?
+1 "मैं इसके बारे में क्यों नहीं सोचा" जवाब के लिए +1। :) –