c ++模板容器扫描程序

时间:2009-12-09 13:08:38

标签: c++ templates stl containers

这就是今天的困境:

假设我

class A{
  public:
   virtual void doit() = 0;
}

然后A的各个子类,都实现了他们的好的doit方法。现在假设我想编写一个带两个迭代器的函数(一个在序列的开头,另一个在结尾)。序列是一个A子类的序列,比如说list<A*>或vector ...函数应该在扫描迭代器时调用所有doit方法...如何做到这一点?我想到了:

template<typename Iterator> void doList(Iterator &begin, Iterator &end) {
    for (; begin != end; begin++) {
        A *elem = (serializable*) *begin;
        elem.doIt();
    }
}

但是会出现奇怪的错误......你有更好的想法或具体信息吗?是否可以使用list<A>代替list<A*>

3 个答案:

答案 0 :(得分:4)

为什么你认为你需要演员?如果它是A *的集合,你应该只能说:

(*begin)->doIt();

答案 1 :(得分:4)

您可以使用std::foreach

std::for_each( v.begin(), v.end(), std::mem_fun( &A::doIt ) );

std::mem_fun将创建一个对象,为其operator()参数调用给定的成员函数。 for_each会为v.begin()v.end()中的每个元素调用此对象。

答案 2 :(得分:1)

您应该提供错误消息以获得更好的答案。

在您的代码中,首先想到的是使用

elem->doIt();

什么是“可序列化”类型?