gpt4 book ai didi

c++ - 特化 iterator_traits

转载 作者:可可西里 更新时间:2023-11-01 17:29:06 25 4
gpt4 key购买 nike

我想专攻std::iterator_traits<>对于 具有通常的嵌套 typedef(如 value_typedifference_type 等)的容器类模板的迭代器,我不应该修改其源代码。基本上我想做这样的事情:

template <typename T> struct iterator_traits<typename Container<T>::iterator> 
{
typedef T value_type;
// etc.
};

除了这不起作用,因为编译器无法推断出 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() { ... }
...
};

现在假设我调用 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> 的迭代器.

最后,我只是希望能够使用std 算法,如count、find、sort 等,最好不修改任何现有代码。我认为 iterator_traits 的重点正是这样:能够为不支持内置的迭代器类型指定类型(如 value_typediff_type 等)。不幸的是,我无法弄清楚如何为 Container<T> 的所有实例专门化特征类。 .

最佳答案

是的。编译器无法推断出 T来自 Container<T>::iterator因为它是不可推导的上下文,换句话说,给定Container<T>::iterator , T 的值不能唯一可靠地推导出来(参见 this for detail explanation)。

这个问题的唯一解决办法是你必须完全专门化iterator_traits对于 iterator 的每个可能值你打算在你的程序中使用。没有通用的解决方案,因为您不允许编辑 Container<T>类模板。

关于c++ - 特化 iterator_traits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com