簡體   English   中英

存儲在std :: map中的C ++基本迭代器

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM