如何为Windows注册表枚举实现前向遍历迭代器 我能够使用一个Windows注册表项中包含的值来创建一个自定义的迭代(以C++方式)。

如何为Windows注册表枚举实现前向遍历迭代器 我能够使用一个Windows注册表项中包含的值来创建一个自定义的迭代(以C++方式)。,c++,winapi,boost,iterator,boost-iterators,C++,Winapi,Boost,Iterator,Boost Iterators,例如: 基本上,迭代器的increment方法调用RegEnumValue增加dwIndex参数(在迭代器类构造函数中最初设置为0),并且当ERROR\u没有更多的项目返回时,将映射到“end”迭代器 我使用了boost::single_pass_traversal_标记: class RegistryValueIterator : public boost::iterator_facade< RegistryValueIterator,

例如:

基本上,迭代器的
increment
方法调用
RegEnumValue
增加
dwIndex
参数(在迭代器类构造函数中最初设置为0),并且当
ERROR\u没有更多的项目返回时,将映射到“end”迭代器

我使用了
boost::single_pass_traversal_标记

class RegistryValueIterator
    : public boost::iterator_facade< RegistryValueIterator,
                                     RegistryValueEntry,
                                     boost::single_pass_traversal_tag >
{
    ...
类注册值迭代器
:public boost::迭代器,
RegistryValueEntry,
boost::单次遍历标记>
{
...
Boost.Filesystem的
目录迭代器(包装)也被实现为单通道迭代器。类似地,它也是一个输入迭代器(而不是前向迭代器)

那么,注册表枚举是否可以将迭代器类别升级为?我应该遵循哪些步骤来实现该目标

换句话说,是否可以使用Windows注册表API(如
RegEnumValue
)实现前向遍历迭代器所需的多程遍历?如果可以,如何实现



p.S.我已经讨论了注册表值枚举/迭代,但是使用的枚举/迭代注册表项的情况非常相似。

您是否尝试过指定
前向遍历标记而不是
单次遍历标记
?是否有效?发生了什么事?我在中没有看到任何东西Boost的文档要求“前向遍历”迭代器支持“多程遍历”,仅支持“单程遍历”。您需要提供您已经尝试过的内容的详细信息,否则这很可能会被视为主题之外的问题,询问人们的意见,而不是解决技术问题。@RemyLebeau:更改标记是不够的:您必须实现正确的语义。对于ForwardIt,它是多通道的,而不是InputIt,它是单通道读取的。请注意与FwdIt在一起(见该答案中的第3条)有比InIt更多的功能,例如一次可以有一个迭代器的多个可用副本,等等。我不清楚在使用RegEnumValue时如何复制迭代器……我已经提供了我在问题中所做的详细信息:它是精确的,一点也不离题。我在发布之前也做了大量的研究。如果你知道的话然后提供为注册表枚举实现FwdIt的技术事实。您解释了如何实现单次遍历迭代器,但没有解释到目前为止您尝试实现的前向遍历迭代器,或者您发现不了解如何实现的研究。您只是问了这是否可能,但什么都没有在任何情况下,要复制注册表枚举,可以使用
DuplicateHandle()复制打开的注册表项句柄
,将当前索引复制到另一个变量,然后您可以彼此独立地枚举这两个句柄。@RemyLebeau:谢谢您提供了更多有趣的信息。听起来这是一条我可以研究的路径。您是否尝试过指定
前向遍历标记
而不是
单次遍历标记
它是否有效?发生了什么事?我在Boost的文档中没有看到任何需要“前向遍历”迭代器来支持“多过程遍历”,而只支持“单过程遍历”。您需要提供您已经尝试过的内容的详细信息,否则这很可能会被视为主题之外的问题,询问人们的意见,而不是解决技术问题。@RemyLebeau:更改标记是不够的:您必须实现正确的语义。对于ForwardIt,它是多通道的,而不是InputIt,它是单通道读取的。请注意与FwdIt在一起(见该答案中的第3条)有比InIt更多的功能,例如一次可以有一个迭代器的多个可用副本,等等。我不清楚在使用RegEnumValue时如何复制迭代器……我已经提供了我在问题中所做的详细信息:它是精确的,一点也不离题。我在发布之前也做了大量的研究。如果你知道的话然后提供为注册表枚举实现FwdIt的技术事实。您解释了如何实现单次遍历迭代器,但没有解释到目前为止您尝试实现的前向遍历迭代器,或者您发现不了解如何实现的研究。您只是问了这是否可能,但什么都没有在任何情况下,要复制注册表枚举,可以使用
DuplicateHandle()复制打开的注册表项句柄
,将当前索引复制到另一个变量,然后您就可以彼此独立地枚举这两个句柄了。@RemyLebeau:谢谢您提供了更多有趣的信息。听起来这是我可以研究的路径。
class RegistryValueIterator
    : public boost::iterator_facade< RegistryValueIterator,
                                     RegistryValueEntry,
                                     boost::single_pass_traversal_tag >
{
    ...