2009-12-09 3 views
0

вот сегодняшняя дилемма:C++ шаблонный контейнер сканер

Я полагаю

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

затем различные подклассы, все реализации их хороший метод Doit. Теперь предположим, что я хочу написать функцию, которая принимает два итератора (один в начале последовательности, другой в конце). Последовательность представляет собой последовательность подклассов A, например, list<A*> или вектора ... Функция должна вызывать все методы doit при сканировании итераторов ... Как это сделать? Я подумал:

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

но дает странные ошибки ... у вас есть лучшие идеи или конкретная информация? Можно ли использовать list<A> вместо list<A*>?

+0

Не могли бы вы привести несколько примеров странных ошибок, которые вы получаете? –

+0

Nit: Вы уверены, что хотите передать итераторы по ссылке? – dirkgently

ответ

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().

+0

+1: но 'foreach' должно быть написано' for_each' –

+0

почему - спасибо! Я слишком много смотрел на PHP-код ... – xtofl

1

Вы должны сообщить об ошибке, чтобы получить лучшие ответы.

В своем коде, то первое, что приходит на ум, чтобы использовать

elem->doIt(); 

Что такое «сериализации» типа?

+0

извините сериализуемые подставки для A. Как компилятор знает, что у elem есть метод doIt ??? – gotch4

+2

Потому что он знает, что elem имеет тип A * – 2009-12-09 13:24:38

4

Почему, по вашему мнению, вам нужен актерский состав? Если набор А * вы просто должны быть в состоянии сказать:

(*begin)->doIt(); 
Смежные вопросы