[英]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.