【发布时间】:2014-09-13 14:31:38
【问题描述】:
我使用的 API 带有使用 void* 句柄的迭代功能。
void* handle = BrowseInit();
while (BrowseGetNext(handle))
{
// ...
int x = BrowseGetData(handle);
}
BrowseFree(handle);
我将如何将其包装到 C++11 迭代器中以用于基于范围的 for 循环?由于handle 的值实际上并没有改变,我需要在operator != () 中使用一些技巧。
class Iterator
{
public:
friend class it;
class it
{
public:
it(Iterator* data) : _data(data) { }
bool operator != (const it& other) const
{
// what should I put in here?
}
const it& operator ++ ()
{
BrowseGetNext(_data->_handle);
}
int operator * () const
{
return BrowseGetData(_data->_handle);
}
private:
Iterator* _data;
};
Iterator() : _handle(BrowseInit()) { }
~Iterator()
{
BrowseFree(_handle);
}
it begin() const
{
return it(this);
}
it end() const
{
return it(nullptr);
}
private:
void* _handle;
};
【问题讨论】:
-
您必须存储前一个
BrowseGetNext的结果。不过,我建议看看Eric Niebler's recent series。
标签: c++ c++11 ranged-loops