2011-04-02 9 views
7

मैं एक टेम्पलेट क्लास को कैसे परिभाषित कर सकता हूं जो इनपुट टेम्पलेट तर्क के रूप में प्रदान किए गए एक (सूचक) प्रकार की "गहराई" का प्रतिनिधित्व करने वाला पूर्णांक निरंतर प्रदान करता है? उदाहरण के लिए, यदि वर्ग Depth बुलाया गया था, निम्नलिखित सच होगा:मैं एक टेम्पलेट क्लास को कैसे परिभाषित कर सकता हूं जो पॉइंटर गहराई/एक प्रकार का स्तर देता है?

Depth<int ***>::value == 3 
Depth<int>::value == 0 

उत्तर

14
template <typename T> 
struct pointer_depth_impl 
{ 
    enum { value = 0 }; 
}; 

template <typename T> 
struct pointer_depth_impl<T* const volatile> 
{ 
    enum { value = pointer_depth_impl<T const volatile>::value + 1 }; 
}; 

template <typename T> 
struct pointer_depth 
{ 
    enum { value = pointer_depth_impl<T const volatile>::value }; 
}; 
+0

धन्यवाद जेम्स, और अंतिम वाक्य भी बहुत उपयोगी है। – user2023370

+1

एक चाल हमेशा 'टी कॉन्स्ट वोल्टाइल' को अगले रिकर्सन तक पास करने के लिए होती है, और उसके बाद केवल '<टी * कॉन्स अस्थिर>' के खिलाफ मिलती है। यह कुछ हद तक हैक है, लेकिन यह विशेष कॉन्स/अस्थिर संस्करण लिखने से बचने के लिए काम करेगा। –

+0

@ जोहान्स: नाइस; जो '' की आवश्यकता से छुटकारा पाता है। मुझे नहीं लगता कि यह विशेष रूप से हैकिश है; कम से कम, अन्य प्रकार के लक्षणों की तुलना में एक हैक का कोई और नहीं :-) –

4

यह प्रत्यावर्तन के माध्यम से किया जा सकता है।

template<typename T> 
struct Depth 
{ 
    enum { value = 0 }; 
}; 

template<typename T> 
struct Depth<T*> 
{ 
    enum { value = Depth<T>::value + 1 }; 
}; 
+0

+1: लेकिन इसके लिए enum का उपयोग करना पसंद करते हैं। –

+0

@ मार्टिन: वास्तव में, संपादित। –

+0

@ मार्टिन: क्या आप समझाएंगे कि enum क्यों पसंद करते हैं? – rafak

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

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