对于类型Class :: Type,我可以从const类派生const Class :: Type吗?

jam*_*lin 6 c++ const c++11 template-argument-deduction

我正在实现一个容器,如:

template<typename T>
class Container
{
public:
    using value_type = T;
    ...
};
Run Code Online (Sandbox Code Playgroud)

有没有办法得到一个好办法const value_typeconst Container

背景:

我已经通过嵌套模板类实现了迭代器类型:

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>;
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但第二个模板参数iterator_base感觉多余.

Sto*_*ica 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;
};
Run Code Online (Sandbox Code Playgroud)