1

我想就一个简单的代码示例提出一些想法:

class Base{

public:
  void doSomeNastyThings(int param)
  {
    IteratorInterface *iter_face = iterators[param];
    for(auto it = iter_face->begin(); it != iter_face->end(); it++)
    {
      //do another nasty things
    }
  }

protected:
  std::map<int, IteratorInterface*> iterators;
};

而且我希望从派生类中填充迭代器映射....但是我怎样才能以 STL 样式创建这样的 IteratorInterface 呢?所有迭代器都会为我提供对相同类型的访问(让我称之为“T”),但它们可以有不同的类型:

std::map<T>::iterator, std::vector<T>::iterator, foo<T>::iterator.
4

2 回答 2

1

一种方法是创建从 IteratorInterface 派生的模板类,它会用迭代器做一些讨厌的事情,实现 IteratorInterface 并为您可能希望它使用的每个迭代器提供实现。但首先你应该阅读这篇文章,并可能重新考虑整个想法。

于 2013-04-11T20:16:54.820 回答
1

这是可能的,但不推荐。

您将必须创建一个抽象基类模板,比如BaseIteratorImpl<T>,并为每个不同的迭代器类型创建一个具体的派生类,比如VectorIteratorImpl<T> : public BaseIteratorImpl<T>。您还需要创建IteratorInterface<T>一个保存并封装指向 的指针BaseIteratorImpl<T>,以便为迭代器提供熟悉的值语义。

更一般地说,而不是VectorIteratorImpl<T>and ListIteratorImpl<T>and ... 可以创建

class IteratorImpl<ContainerType> : 
    public BaseIteratorImpl<typename ContainerType::value_type> 

并使用例如IteratorImpl<vector<double> >

IteratorInterface<T>会将所有常见的迭代器操作转发给它的BaseIteratorImpl<T>成员。BaseIteratorImpl<T>对于这些操作中的每一个,都会有一个纯虚函数。IteratorImpl<C>将执行这些操作。

不建议这样做,因为您将不得不编写大量代码,结果只会造成巨大的性能损失。

而不是迭代器,您应该使用您的算法(内部发生的事情)执行此操作(模板化+虚拟化doSomeNastyThings)。

于 2013-04-11T20:39:49.473 回答