【问题标题】:Is there any polymorphic wrapper for stl iterator from any container?是否有来自任何容器的 stl 迭代器的多态包装器?
【发布时间】:2020-12-25 23:13:07
【问题描述】:

我需要一个接受begin, end 输入迭代器作为参数的虚拟 函数,但我不想将它与特定容器的迭代器类绑定。 标准(现代)C++ 库中是否有任何东西允许从客户端隐藏特定的迭代器类并表现为 GenericInputIterator、GenericForwardIterator 等?我想它应该是多态的。

【问题讨论】:

  • TLDR:不,C++ 不能以这种方式工作。 C++ 库中没有类似的东西,因为从根本上说,该语言无法使用它。有些东西要么是模板,要么是类。没有虚拟模板函数之类的东西,就是这样。
  • @SamVarshavchik 没有什么能阻止您编写类型擦除的迭代器类,这正是问题所要求的。它会是 v e y s l o w。 是标准库没有的原因。 Boost 称之为any_iterator
  • @HTNW - 这正是我所说的。所以你说“不”...
  • 教科书或网上有很多文章(例如,Scott Meyers)解释了为什么 C++ 标准库不提供这样的“类型擦除”或“通用”(另一个术语我已经见使用)迭代器。本质上,这样的迭代器将被限制为仅具有由所有迭代器类型提供的操作(大多数迭代器类型具有一些不被所有其他迭代器类型共享的操作)并且该迭代器支持的每个操作都将具有最坏情况下的性能对于所有可能的迭代器。

标签: c++


【解决方案1】:

语言中没有。

boost 中有一个,尽管它是 any_range<> 的实现细节。

涉及相当大的性能成本,实际上通常如此之多,因此我一般建议不要这样做。假设您将在对性能不敏感的部分代码中使用它,您很少可以使用它来接受已擦除的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2013-04-16
    • 2011-12-25
    相关资源
    最近更新 更多