2017-08-21 11 views
6

मैं की तरह एक कंटेनर को लागू कर रहा हूँ:एक प्रकार के लिए कक्षा :: प्रकार, क्या मैं कॉन्स्ट क्लास :: कॉन्स क्लास से टाइप कर सकता हूं?

template<typename T> 
class Container 
{ 
public: 
    using value_type = T; 
    ... 
}; 

वहाँ const Container से एक const value_type प्राप्त करने के लिए एक अच्छा तरीका है?

पृष्ठभूमि:

मैं एक नेस्टेड टेम्पलेट वर्ग के माध्यम से इटरेटर प्रकार लागू कर दिया है:

template<typename Container, typename Value> 
class iterator_base 
{ 
public: 
    ... 
    Value& operator*() const; 

private: 
    Container* c; 
}; 

using iterator = iterator_base<Container, value_type>; 
using const_iterator = iterator_base<const Container, const value_type>; 

जो ठीक काम करता है, लेकिन iterator_base से पीछे नहीं टेम्पलेट तर्क बेमानी लगता है।

उत्तर

7

दूसरा पैरामीटर को हटाने का स्पष्ट तरीका होगा, और const को जोड़ा जाना चाहिए या नहीं, यह निर्धारित करने के लिए पहले के कॉन्स्टेस पर भरोसा करें। मानक लाइब्रेरी में इसके लिए कुछ उपयोगी मेटा-फ़ंक्शंस हैं:

#include <type_traits> 

template<typename Container> 
class iterator_base 
{ 
    using Value = typename std::conditional<std::is_const<Container>::value, 
        typename std::add_const<typename Container::value_type>::type, 
        typename Container::value_type>::type; 
public: 
    ... 
    Value& operator*() const; 

private: 
    Container* c; 
}; 
संबंधित मुद्दे