Я считаю, что Boost iterators elegants, хотя они могут быть немного многословными (алгоритмы на основе диапазона сделают это лучше).В этом случае итераторы преобразования могут выполнять работу:
#include <boost/iterator/transform_iterator.hpp>
//...
int totalSize = std::accumulate(
boost::make_transform_iterator(vf.begin(), std::mem_fn(&Foo::size)),
boost::make_transform_iterator(vf.end(), std::mem_fn(&Foo::size)),0);
Редактировать: заменить "boost::bind(&Foo::size,_1)
" на "std::mem_fn(&Foo::size)
"
Редактировать: я только что нашелчто библиотека Boost.Range была обновлена для представления алгоритмов диапазона!Вот новая версия того же решения:
#include <boost/range/distance.hpp> // numeric.hpp needs it (a bug?)
#include <boost/range/numeric.hpp> // accumulate
#include <boost/range/adaptor/transformed.hpp> // transformed
//...
int totalSize = boost::accumulate(
vf | boost::adaptors::transformed(std::mem_fn(Foo::size)), 0);
Примечание: производительность примерно одинакова (см. Мой комментарий): внутренне, transformed
использует transorm_iterator
.