AnyIterator 和 boost 迭代器外观

发布于 2024-10-18 19:59:35 字数 260 浏览 2 评论 0原文

是否可以使用 boost 迭代器外观实现任何迭代器? 我不想在我的基类中定义实现细节

class Base
{
public:
typedef std::vector<int>::iterator iterator;//implementation detail
...
virtual iterator begin()=0;
virtual iterator end()=0;
};

,或者我是否必须完全从头开始编写一个;

Is it possible to implement an any iterator with boost iterator facade?
I don't want to define implementation details in my baseclass

class Base
{
public:
typedef std::vector<int>::iterator iterator;//implementation detail
...
virtual iterator begin()=0;
virtual iterator end()=0;
};

or do i have to write one completely from scratch;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森末i 2024-10-25 19:59:35

您发布的代码已修复从 Base 返回的迭代器类型及其对 std::vector::iterator 的所有实现,这可能不是您想要的想。 Jeremiah 的建议是一种方法,但有一个缺点:你失去了与 STL 的兼容性...我知道多态迭代器包装器的三种实现:

  1. becker 的 any_iterator (它实现 boost::iterator_facade< /code>)
  2. opaque_iterator库(google一下),或者
  3. Adobe非常有趣的poly库,其中包含符合STL的any_iterator的层次结构。

这个问题比看起来更难......我自己尝试了一下,主要是因为我需要 any_iterators 类型参数中的协变(any_iterator 应该自动转换为 < code>any_iterator

) 很难用类似 STL 的迭代器干净地实现。像 Enumerator 这样的 AC# 更容易实现(*)(恕我直言,通常是比类似 STL 的迭代器对更清晰的概念),但同样,您“失去”了 STL。

(*) = 当然没有“产量”:-)

The code you've posted has fixed the type of iterators returned from Base and all it's implementantions to std::vector<int>::iterator which is probably not what you want. Jeremiah's suggestion is one way to go with one drawback: you loose compatibility with STL... I know of three implementations of a polymorphic iterator wrapper:

  1. becker's any_iterator (which implements boost::iterator_facade)
  2. the opaque_iterator library (google for it), or
  3. Adobe's very interesting poly library which contains a hierarchy of STL conforming any_iterators.

The problem is harder than it might seem... I made an attempt myself mainly because I needed covariance in any_iterators type argument (any_iterator<Derived> should be automatically convertible to any_iterator<Base>) which is difficult to implement cleanly with STL like iterators. A C# like Enumerator<T> is easier to implement(*) (and imho generally a cleaner concept than STL-like pairs of iterators) but again, you "loose" the STL.

(*) = without 'yield' of course :-)

微暖i 2024-10-25 19:59:35

我想这可能就是您正在寻找的:

any_iterator:C++ 迭代器的类型擦除

以下是该页面的片段:

概述

类模板 any_iterator 类似于 boost::function
迭代器。它允许您拥有一个变量并分配给它
不同类型的迭代器,只要这些迭代器有一个
合适的通用性。

I think this may be what you're looking for:

any_iterator: Type Erasure for C++ Iterators

Here's a snippet from that page::

Overview

The class template any_iterator is the analog to boost::function for
iterators. It allows you to have a single variable and assign to it
iterators of different types, as long as these iterators have a
suitable commonality.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文