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

标签 c++ c++11 constants template-argument-deduction

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

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 的第二个模板参数感觉多余。

最佳答案

显而易见的方法是删除第二个参数,并根据第一个参数的常量特性来确定是否应添加 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;
};

关于c++ - 对于类型 Class::Type,我可以从 const Class 派生 const Class::Type 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796860/

相关文章:

properties - D:常量正确性——我做错了什么?

c++ - 递归内联函数

c++ - RedHat 上 GCC 4.4.5 中的运行时问题,但在 Apple llvm 4.2 上运行正常?

c++ - 将对象从一个 std::deque 移动到另一个的更好方法?

c++ - 从构造函数参数的组合生成变量类型的对象

Delphi:所有常数都是常数,但有些常数比其他常数更常数?

c++ - 可变含义逻辑常量是否存在任何强制机制?

c++ - 获取 vector<float> 中 k 个最大值的索引的有效方法

c++ - H264解析-片头检测

c++ - OSX "error: cannot convert ' const std::__cxx11::basic_string<char>"是什么意思?