int count = std::accumulate(x.begin(), x.end(), 0, [](int current_count, A* a)
{
if (dynamic_cast<D*>(a)) ++current_count;
return current_count;
});
должен сделать трюк.
Если у вас нет доступной лямбды, конечно, вам придется использовать все это в реальной функции.
count_if версия:
auto count = std::count_if(x.begin(), x.end(), [](A* a) { return dynamic_cast<D*>(a) != 0; });
Если у вас нет авто, вам нужно объявить тип: std::iterator_traits<X_type::iterator>::difference_type
Вы можете просто попробовать присвоить int
, но, если я правильно читаю, difference_type
может быть любым целым типом и может вызвать предупреждение / переполнение. Сомнительно, что это произойдет, и static_cast исправит это.
Если вы просто хотите вызвать некоторые операторы D *, используйте для этого foreach и приведенную выше методологию. Возможно, вы захотите просмотреть различные шаблоны посетителей.