[英]C++ base iterator stored within std::map
我想在一个简单的代码示例中提出一些想法:
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.
一种方法是创建从IteratorInterface派生的模板类,该模板类将使用Iterator做讨厌的事情,实现IteratorInterface并为您可能希望与之一起使用的每个迭代器提供实现。 但是首先,您应该阅读这篇文章,并可能重新考虑整个想法。
有可能,但不建议这样做。
您将必须创建一个抽象的基类模板,例如BaseIteratorImpl<T>
,并为每种不同的迭代器类型创建一个具体的派生类,例如VectorIteratorImpl<T> : public BaseIteratorImpl<T>
。 您还需要创建IteratorInterface<T>
,该IteratorInterface<T>
保留并封装指向BaseIteratorImpl<T>
的指针, BaseIteratorImpl<T>
迭代器提供熟悉的值语义。
更笼统地说,代替VectorIteratorImpl<T>
和VectorIteratorImpl<T>
ListIteratorImpl<T>
和...
class IteratorImpl<ContainerType> :
public BaseIteratorImpl<typename ContainerType::value_type>
并使用例如IteratorImpl<vector<double> >
。
IteratorInterface<T>
会将所有常规迭代器操作转发到其BaseIteratorImpl<T>
成员。 BaseIteratorImpl<T>
对于这些操作中的每一个都将具有纯虚函数。 IteratorImpl<C>
将实现这些操作。
不建议这样做,因为您将不得不编写大量的代码,结果只会造成巨大的性能损失。
代替迭代器 ,您应该使用算法 ( doSomeNastyThings
内部发生的事情)执行此操作(模板化+虚拟化)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.