【发布时间】:2011-05-04 11:58:50
【问题描述】:
我希望定义一个自定义迭代器,它使用无法复制的值类型。
这样做的基本原理是迭代器将负责 Windows 下的模块枚举,并且我使用 CreateToolhelp32Snapshot/Module32First/Module32Next API 来避免必须预处理整个模块列表(例如,每个迭代器增量应该提前到按需列表中的下一个模块,以避免不必要的开销。)。问题在于这些 API 需要使用由 Toolhelp API 管理的“句柄”,因此除了调用 First/Next 之外,我无法控制列表中的“位置”。
我可以在技术上允许复制句柄,但是你会遇到这样的问题:
auto Iter1 = ModList.begin(); // Assume 'ModList' is an instance of my class which manages construction etc of my iterator
auto Iter2 = Iter1; // Both iterators now point to the first module in the list
++Iter1; // BOTH iterators now point to the second module in this list!! We just 'broke' the expected behavior of 'Iter2'.
是否可以定义一个与 STL 兼容的迭代器(可以与标准算法等一起使用),它可以很好地处理无法复制或分配的值类型?
我还可以在迭代器的实现中将值类型包装在共享指针中,这将使迭代器本身可复制和可分配,但它仍然不能解决上面代码中概述的问题。
注意:如果有帮助,我可以使值类型可移动。
我的代码库中已经严重依赖 Boost,因此请随意建议使用 Boost 的解决方案。
很抱歉这个问题写得不好,我已经有一段时间了,我的大脑不想再正常工作了。 :P 让我知道是否需要澄清。
【问题讨论】:
-
听起来你真正想要的是生成器函子,而不是迭代器。
标签: c++ windows boost stl iterator