在最后一天左右,我一直在为此而烦恼。我想弄清楚如何在隐藏类正在使用的容器类型时从类中返回迭代器。一个例子是我有一个类画布,它拥有相同界面的小部件,并且它们被私人存储在一个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