ブースト イテレータはエレガントですが、少し冗長になる可能性があります (範囲ベースのアルゴリズムがこれを改善します)。この場合、変換イテレータがその仕事を行うことができます:
#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
.