2017-08-21 1 views
6

私は次のようにコンテナを実装しています:Class :: Type型の場合、constクラス:: Typeからconstクラスを派生させることはできますか?

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

const Containerからconst value_typeを導出するための良い方法はありますか?

背景:私は、ネストされたテンプレートクラスを経由してイテレータ型を実装している

:大丈夫動作しますが、iterator_baseの2番目のテンプレート引数が冗長に感じ

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>; 

答えて

7

明白な方法は、2番目のパラメータを削除して、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; 
}; 
関連する問題