相关疑难解决方法(0)

正在弃用的std :: iterator的准备工作

3月21 日,标准委员会投票赞成批准P0174中std::iterator提议的弃用:

对于读者而言,很长的void参数序列不仅仅是简单地typedef在类定义本身中提供预期的s,这是当前工作草案采用的方法,遵循设置的模式

在之前std::iterator,鼓励继承从迭代器样板实现中删除乏味.但弃用将需要以下其中一项:

  1. 迭代器样板现在需要包含所有必需的typedefs
  2. 使用迭代器的算法现在需要使用auto而不是依赖于迭代器来声明类型
  3. 洛基阿斯塔曾建议说std::iterator_traits,可以更新,而继承工作std::iterator

有人可以告诉我我应该期待哪些选项,因为我设计了自定义迭代器,着眼于兼容性?

c++ standards iterator deprecated c++17

58
推荐指数
2
解决办法
1万
查看次数

专门化iterator_traits

我想专门std::iterator_traits<>为一个容器类模板的迭代器,它不具有通常的嵌套类型定义(如value_type,difference_type等),其源我不应该修改.基本上我想做这样的事情:

template <typename T> struct iterator_traits<typename Container<T>::iterator> 
{
    typedef T value_type; 
    //  etc.
}; 
Run Code Online (Sandbox Code Playgroud)

除了这不起作用,因为编译器无法推断T从Container<T>::iterator.

是否有任何工作方式来实现相同的目标?


例如:

template <typename T>
class SomeContainerFromAThirdPartyLib
{
    typedef T ValueType;    //  not value_type! 
    //  no difference_type

    class iterator
    {
        typedef T ValueType;    //  not value_type! 
        //  no difference_type  
        ...
    }; 
    iterator begin() { ... }
    iterator end() { ... }
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

现在假设我std::count()使用此类的实例调用.据我所知,在大多数STL实现中,count()返回iterator_traits<Iterator>::difference_type.iterator_traits<I>简单的主要模板typedef …

c++ template-specialization iterator-traits

8
推荐指数
2
解决办法
5734
查看次数