我想对一个简单的代码示例提出一些想法:
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.
答案 0 :(得分:1)
一种方法是创建从IteratorInterface派生的模板类,它将使用迭代器执行令人讨厌的事情,实现IteratorInterface并为您可能希望它使用的每个迭代器提供实现。但首先你应该阅读this帖子,并可能重新思考整个想法。
答案 1 :(得分:1)
有可能,但不推荐。
您必须创建一个抽象基类模板,比如说BaseIteratorImpl<T>
,并且对于每个不同的迭代器类型,创建一个具体的派生类,比如说VectorIteratorImpl<T> : public BaseIteratorImpl<T>
。您还需要创建保存并封装指向IteratorInterface<T>
的{{1}},以便为迭代器提供熟悉的值语义。
更一般地说,而不是BaseIteratorImpl<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>
内发生的事情)执行此操作(模板化+虚拟化)。