在最後一天左右,我一直在爲此而煩惱。我想弄清楚如何在隱藏類正在使用的容器類型時從類中返回迭代器。一個例子是我有一個類畫布,它擁有相同界面的小部件,並且它們被私人存儲在一個std :: vector中。所以....如何隱藏自定義類中的迭代器和容器實現(不提升)
簡化代碼
class Canvas
{
public:
WidgetIterator begin();
WidgetIterator end();
private:
class Impl;
std::unique_ptr<Impl> mImpl;
};
class Canvas::Impl
{
public:
std::vector<widget> mWidget;
//how to return mWidget.begin(), mWidget.end() up as widget iterator??
}
usage:
int main()
{
Canvas canvas();
...Fill canvas with widgets...
//iterate over widgets
for(auto& a_widget : canvas)
{
//do something with/to a_widget. User does not know or care
//that underlying iterator is std::vector<widget>::iterator
}
...Do more stuff....
return 0;
}
基本上,我想以某種別名mWidget.begin()和mWidget.end()向上穿過帆布::開始()和Canvas: :結束()。用戶知道迭代器是一個小部件,他們只是不需要知道迭代器是std :: vector :: iterator。我試圖使用PIMPL來隱藏我的實現,並保存關於事物如何存儲在類中的信息。
我似乎無法找到正確的「公式」。我已經看過類型擦除,並試圖通過接口返回函數指針,但我似乎無法想出一種方法來保持std :: vector :: iterator不在標題中,以及我迄今爲止所看到的所有內容看起來這似乎不符合我想要做的。有人能指引我朝着正確的方向嗎?閱讀材料?有沒有我失蹤的概念?噢 - 我已經看到了一些有用的例子,我無法弄清楚如何在我的情況下工作。我想避免這種情況,因爲我試圖減少外部依賴。
非常感謝您提前!
你不能只是*文件*,你的WidgetIterator是一個*未指定的*隨機訪問迭代器(或任何你想要的迭代器類)?例如,標準庫不會對其迭代器類型施加特殊的限制,除了迭代器概念所強加的類型(例如,vector <> :: iterator可能只是一個指針)... –
實現您自己的迭代器。它可以在內部使用std :: vector迭代器,或者不使用。迭代器必須實現很少的「功能」才能使用。 –
所以迭代是一個非常密集的過程,涉及與迭代器的大量交互。你認爲重擊性能很好嗎? – Yakk