我有一些类,由于各种原因超出了本讨论的范围,我无法修改(省略了不相关的实现细节):
class Foo { /* ... irrelevant public interface ... */ };
class Bar {
public:
Foo& get_foo(size_t index) { /* whatever */ }
size_t size_foo() { /* whatever */ }
};
Run Code Online (Sandbox Code Playgroud)
(我正在处理许多类似的'Foo'和'Bar'类,它是从其他地方生成的代码和我不想要子类的东西等等)
[编辑:澄清 - 虽然有许多类似的'Foo'和'Bar'类,但保证每个"外部"类都有getter和size方法.对于每个"外部",只有getter方法名称和返回类型会有所不同,具体取决于它所包含的"内部"类型.
所以,如果我有包含Quux实例的Baz,那么会有Quux&Baz :: get_quux(size_t index)和size_t Baz :: size_quux().]
鉴于Bar类的设计,你不能轻易地在STL算法中使用它(例如for_each,find_if等),并且必须做必要的循环而不是采用函数式方法(我更喜欢后者的原因也不在这个讨论):
Bar b;
size_t numFoo = b.size_foo();
for (int fooIdx = 0; fooIdx < numFoo; ++fooIdx) {
Foo& f = b.get_foo(fooIdx);
/* ... do stuff with 'f' ... */
}
Run Code Online (Sandbox Code Playgroud)
所以...我从来没有创建过自定义迭代器,在阅读了关于iterator_traits之类的各种问题/答案之后,我想出了这个(目前已经半生不熟的)"解决方案":
首先,自定义迭代器机制(注意:'function'和'bind'的所有用法都来自MSVC9中的std :: tr1):
// Iterator mechanism... …Run Code Online (Sandbox Code Playgroud)