2017-08-21 69 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; 
}; 
相關問題