2014-04-08 1 views
8

क्या टेम्पलेट तर्क की स्थिरता के आधार पर टेम्पलेट वर्ग के गैर-कॉन्स्ट/कॉन्स्ट डेटा सदस्य को सशर्त रूप से सक्षम करना संभव है? या शायद कुछ सशर्त typedef है? मैंने std :: is_const के साथ std :: enable_if का उपयोग करने के बारे में सोचा, लेकिन कोई std :: is_not_const नहीं है जिसे मैं उपयोग कर सकता हूं।क्या टेम्पलेट तर्क की स्थिरता के आधार पर टेम्पलेट वर्ग के गैर-कॉन्स्ट/कॉन्स्ट डेटा सदस्य को सशर्त रूप से सक्षम करना संभव है?

class A; 

template <typename T> 
class Test 
{ 
    A& m_a; // If T != const. 
    const A& m_a; // If T == const. 
}; 

ध्यान दें कि हमेशा टी = ए

उत्तर

11

हाँ, आप std::conditional उपयोग कर सकते हैं:

template <typename T> 
class Test 
{ 
    typename 
    std::conditional<std::is_const<T>::value, const A&, A&>::type 
    m_a; 
}; 
+0

शायद इस प्रश्न का उत्तर यहां से दिया जा सकता है क्योंकि यह संबंधित है। कुछ टी होने पर, क्या 'शुद्ध प्रकार' को std :: remove_const के साथ भी गलत हो सकता है, यहां तक ​​कि जब टी वास्तव में गैर-कॉन्स्ट है? – NFRCR

+0

यह ठीक है। 'remove_const' मूल प्रकार वापस देगा यदि यह योग्यता योग्य नहीं है। लेकिन ध्यान दें कि 'remove_const ' 'कॉन्स्ट टी एंड 'देता है क्योंकि यह केवल शीर्ष-स्तरीय क्वालीफायर को हटा देता है। – jrok

5

हाँ, आप ऐसा कर सकते हैं। <type_traits> हेडर के पास इस उद्देश्य के लिए टूल हैं।

template <typename T> 
class Test 
{ 
    typename std::conditional< 
     std::is_const<T>::value, 
     typename std::add_const<A>::type, 
     typename std::remove_const<A>::type 
    >::type m_a; 
}; 

तुम भी इस उद्देश्य के लिए एक सहायक बना सकता है:

//T is type to modify 
//S is source type to mimic 
struct mimic_const<T, S> 
{ 
public: 
    typedef typename std::conditional< 
     std::is_const<S>::value, 
     typename std::add_const<T>::type, 
     typename std::remove_const<T>::type 
    >::type type; 
}; 

फिर इसका उपयोग इस प्रकार करें:

template <typename T> 
class Test 
{ 
    typename mimic_const<A, T>::type m_a; 
}; 
+0

'add_const' यहां एक ओवरकिल का थोड़ा सा है। – jrok

+0

@jrok परिभाषित करें "ओवरकिल" ... –

+0

ठीक है, 'कॉन्स्ट ए' पर्याप्त है। और आपको वहां 'टाइपनाम' की भी आवश्यकता है। – jrok

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