gpt4 book ai didi

c++ - 包装迭代句柄以用于基于范围的 for 循环

转载 作者:太空狗 更新时间:2023-10-29 23:03:39 25 4
gpt4 key购买 nike

我使用的 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;
};

最佳答案

这应该有效。

class Iterator
{
public:

friend class it;
class it
{
public:

// Constructor for begin().
it(Iterator* data) : _data(data), index_(0) { }

// Constructor for end().
it(Iterator* data, int) : _data(data), index_(-1) { }

bool operator != (const it& other) const
{
return !(*this == other);
}
bool operator == (const it& other) const
{
return ( this->_data == other._data && this->_index == rhs._index );
}

const it& operator ++ ()
{
// Increment the index if there's more data.
// Otherwise, set it to -1.
if ( BrowseGetNext(_data->_handle) )
{
++index_;
}
else
{
index_ = -1;
}
}

int operator * () const
{
return BrowseGetData(_data->_handle);
}

private:
Iterator* _data;
int _index;
};

Iterator() : _handle(BrowseInit()) { }
~Iterator()
{
BrowseFree(_handle);
}

it begin() const
{
return it(this);
}
it end() const
{
return it(this, 0);
}

private:

void* _handle;
};

更新:为it设置iterator_traits

template <> struct std::iterator_traits<Iterator::it>
{
typedef int difference_type;
typedef int value_type;
typedef int* pointer;
typedef int& reference;
typedef std::forward_iterator_tag iterator_category;
};

谢谢你的建议,Yakk。

更新 2

不是为 Iterator::it 专门化 std::iterator,而是从 std::iterator 派生 Iterator::it

class it : public std::iterator<std::forward_iterator_tag, int, int>
{
....
};

关于c++ - 包装迭代句柄以用于基于范围的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24892998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com