【发布时间】:2011-12-17 04:26:44
【问题描述】:
我想将std::iterator_traits<> 专门用于容器类模板的迭代器,该容器类模板不 具有通常的嵌套类型定义(如value_type、difference_type 等)及其来源我不应该修改。基本上我想做这样的事情:
template <typename T> struct iterator_traits<typename Container<T>::iterator>
{
typedef T value_type;
// etc.
};
除了这不起作用,因为编译器无法从Container<T>::iterator 推断出T。
有没有什么可行的方法来达到同样的效果?
例如:
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() { ... }
...
};
现在假设我使用此类的实例调用std::count()。据我所知,在大多数 STL 实现中,count() 返回iterator_traits<Iterator>::difference_type。 iterator_traits<I> 的主要模板只做typedef typename I::difference_type difference_type。与其他嵌套类型相同。
现在在我们的示例中这显然不起作用,因为没有Container::iterator::difference_type。我想我可以在不修改迭代器类的情况下解决这个问题,方法是将iterator_traits 专门用于任何Container<T> 的迭代器。
最后,我只是希望能够使用标准算法,如计数、查找、排序等,最好不修改任何现有代码。我认为iterator_traits 的全部意义在于:能够为不支持内置的迭代器类型指定类型(如value_type、diff_type 等)。不幸的是,我不知道如何为Container<T> 的所有实例专门化特征类。
【问题讨论】:
-
Container是在哪里声明的?还是任何容器? -
任何破坏 stl 支持的容器:它确实有迭代器和 const_iterator,它们可以递增、递减、取消引用等,但容器和迭代器都没有符合 std 的嵌套 typedef。
-
我仍然没有完全理解这个问题。您能否更新问题,并在您的问题中举例说明您将如何使用它?我的意思是
iterator_traits<T>什么时候应该使用默认类,什么时候应该使用专用版本? -
@iammilind:我已经编辑了这个问题,希望现在更容易理解。
-
收到了您的问题。我认为 Nawaz 的回答和他对另一个问题的链接很有用。
标签: c++ template-specialization iterator-traits