【发布时间】:2012-11-20 04:13:50
【问题描述】:
所以基本上我想做的是有一个纯虚方法将迭代器返回到具体类型的任意集合,例如在伪代码中:
virtual Iterator<T> getIterator() const = 0;
这个类的用户实际上并不关心子类使用什么实现。可以是集合、向量、列表、数组等。
我知道std::iterator 类,但我找不到正确指定它以便使用简单向量的方法。
virtual std::iterator<std::random_access_iterator_tag,T> getIterator() const = 0;
myVector.begin() // compilation error in implementation
用const T 定义std::iterator 作为类型参数也没有奏效。我还尝试离开T,而是将指针和引用类型定义为const T* 和const T&。
通过查看std::vector 实现,我发现std::vector::const_iterator 实际上派生自_Iterator012,派生自_Iterator_base。
我真的很烦,没有任何方法可以处理 std 中的任意集合。
将我的类实现为 <algorithm> 中的模板对我来说不是一个选择,原因有两个:
- 无法控制实际值类型
- 我只是不想让我的类模板使我的设计变得复杂,并降低灵活性。
使用的类型参数T只是为了演示,实际上这是一个具体的类型。
【问题讨论】:
-
This article 可能有用。
-
这正是模板的用途和标准库使用它们。它们只会让您的代码更加灵活!
-
所以你想要模板,而不使用模板,这让你很困扰,除了模板的巨大特性之外,C++ 不支持模板。是的,你可能在这里有所收获。
-
@LightnessRacesinOrbit 请留下这个问题。我只是不想无缘无故地与一个讽刺的人争论。一方面:我没有看到解释我的整个架构的意义,只是为了证明模板对我来说是没有选择的。在我的具体情况下,我不想使用它们,忍受它。没有人能提出具体的解决方案而不是讨论范式吗?
-
如果您不介意动态分配,您可以为您的值类型创建一个简单的类型擦除迭代器。