我有一个类,其中包含和管理一系列对象。为了避免泄露这些对象的存储方式,同时允许迭代它们,我决定使用类型擦除,使用boost::any_iterator
。
using my_erased_type_iterator = boost::range_detail::any_iterator<
MyClass,
boost::bidirectional_traversal_tag,
MyClass&,
std::ptrdiff_t>;
我在
MyClass
中定义了一个函数Begin()
和End()
,它们只是将容器的begin()
和end()
函数作为my_erased_type_iterator
返回。它完全按照我的要求工作,除了MyClass
外的任何人都不知道我正在使用向量来存储对象,也没有访问容器的权限,除了我在Myclass
接口中公开的函数。
现在,由于很多原因,我需要通过反向迭代器进行迭代。我还需要知道反向迭代器之后的下一个元素(类似于在正常迭代器上调用std::next()
,这对于反向迭代器来说已经不那么简单了),我可能还需要在该反向迭代器上调用erase()
等函数。
所以我的问题是:是否有一种优雅的方式可以将类型抹除与反向迭代器(以及前向和反向的const版本)一起使用?我应该使用前向类型抹除迭代器并倒序迭代吗?我想到我可能是错误地解决了这个问题,所以我愿意接受任何建议或澄清我的问题(如果需要的话)。
erase()
相关的请求 - 由于所有的 "类型擦除",我错过了它。你不能使用 "烘焙" 的迭代器来使用erase
,因为没有(不麻烦的)方法可以回到底层迭代器。/cc @Yakk - sehestd::function::target<T>()
的等效物?懒鬼们。 - Yakk - Adam Nevraumont