auto getcount = std::mem_fun(&Base::count); // nothing to bind, we just need a functor
size_t sum = std::accumulate(
boost::make_transform_iterator(ptrs_.begin(), getcount),
boost::make_transform_iterator(ptrs_.end(), getcount),
(size_t)0
);
が気に入らない場合auto
、またはコンパイラが気に入らない可能性が高い場合は、もちろん、それを 2 回貼り付けたり、 の戻り値の型を探したりmem_fun
、関数テンプレートを使用してキャプチャしたりできます。
template <typename IT, typename FUNC, typename T>
T transform_accumulate(IT first, IT last, T init, FUNC func) {
return std::accumulate(
boost::make_transform_iterator(first, func),
boost::make_transform_iterator(last, func),
init
);
}
次に、次のように呼び出します。
transform_accumulate(ptrs_.begin(), ptrs_.end(), size_t(), std::mem_fun(&Base::count));
代わりに、std::accumulate
2 項ファンクターを取る次の形式を使用します。
struct AddCount {
size_t operator()(size_t result, Base *p) const {
return result + p->count();
}
};
size_t sum = std::accumulate(ptrs_.begin(), ptrs_.end(), size_t(), AddCount());
を書く代わりにAddCount
、もちろんラムダ式を使用することもできます。の内容も使用して構築できると思いますが<functional>
、そうするつもりはありません。
私はこのコードをテストしていないので、エラーの発見を始めましょう!