2017-08-21 93 views
6

我实现像一个容器:对于Class :: Type类型,我可以从const类派生const Class :: Type吗?

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; 
}; 
相关问题