C++ 实施运营商->;在一系列适配器中';s迭代器类 让我们考虑一个非常基本的范围适配器类,它围绕一个范围,在遍历适配器时迭代原来范围的每个元素。 for (const auto & e : everyOtherElement(originalRange))
在编写这样一个范围适配器类时,需要为该适配器编写一个相应的迭代器类,以使其具有可移植性并按照所需的方式运行 例如,这样的迭代器类应该实现您希望它支持的“概念”所需的一切。除此之外,我们应该实现C++ 实施运营商->;在一系列适配器中';s迭代器类 让我们考虑一个非常基本的范围适配器类,它围绕一个范围,在遍历适配器时迭代原来范围的每个元素。 for (const auto & e : everyOtherElement(originalRange)),c++,c++11,iterator,range,adaptor,C++,C++11,Iterator,Range,Adaptor,在编写这样一个范围适配器类时,需要为该适配器编写一个相应的迭代器类,以使其具有可移植性并按照所需的方式运行 例如,这样的迭代器类应该实现您希望它支持的“概念”所需的一切。除此之外,我们应该实现operator*来返回对所表示元素的引用,以及operator->以便it->member访问该元素的成员 我认为简单地将这些操作符“转发”到适配器围绕的底层迭代器的实现是一个好主意(让我们暂时忘记常量): 请参阅标准迭代器适配器规范,例如: 他们将指针类型定义为迭代器,实际上是由操作符->定义的,因为我
operator*
来返回对所表示元素的引用,以及operator->
以便it->member
访问该元素的成员
我认为简单地将这些操作符“转发”到适配器围绕的底层迭代器的实现是一个好主意(让我们暂时忘记常量):
请参阅标准迭代器适配器规范,例如:
他们将
指针
类型定义为迭代器
,实际上是由操作符->
定义的,因为我假设涉及到模板,我建议只使用SFINAE/tag dispatch来选择实现,这取决于原始迭代器是否为指针。
struct everyOtherElement {
OriginalIterator b, e; // The begin and end we wrap around
// ...
struct iterator {
OriginalIterator it;
auto operator*() { return *it; } // <------
auto operator->() { return it.operator->(); } // <------
// ...
};
};
auto operator->() { return it; }
pointer Iterator