Если бы я знал, каков настоящий код за этими foobars, возможно, я бы знал лучше, но разве нет решения для вашей проблемы в STL?
for_each(s.begin(), s.end(), DoStuffOnI());
Просто поместите ваш код "делай вещи на * i" в функцию или функтор:
struct DoStuffOnI : public std::unary_function<MyType&,void> {
void operator()(MyType& obj) {
// do stuff on *i
}
};
Если вам надоело отправлять два параметра вместо одного, тогда хорошо, возможно, вы можете сделать что-то вроде:
template<typename In>
struct input_sequence_range : public std::pair<In,In> {
input_sequence_range(In first, In last) : std::pair<In,In>(first, last)
{
}
};
template<typename C>
input_sequence_range<typename C::iterator> iseq(C& c)
{
return input_sequence_range<typename C::iterator>(c.begin(), c.end());
}
template<typename In, typename Pred>
void for_each(input_sequence_range<In> r, Pred p) {
std::for_each(r.first, r.second, p);
}
Тогда вызывайте for_each так:
for_each(iseq(s), DoStuffOnI());