【发布时间】:2016-05-03 16:53:22
【问题描述】:
我有一个包含和管理一系列对象的类。为了避免在允许迭代它们的同时泄露这些对象的存储方式,我决定使用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与“烘焙”迭代器一起使用,因为没有(unhacky)方法可以返回底层迭代器。 /cc @Yakk -
@sehe 叹了口气,他们不包括
std::function::target<T>()的等价物?懒鬼。
标签: c++ boost iterator reverse-iterator boost-type-erasure