小编DAl*_*dge的帖子

通过自定义模板化迭代器调整非迭代容器以进行迭代

我有一些类,由于各种原因超出了本讨论的范围,我无法修改(省略了不相关的实现细节):

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)

c++ templates

6
推荐指数
1
解决办法
229
查看次数

标签 统计

c++ ×1

templates ×1