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
,或者更可能的,如果你的編譯器沒有,那麼你當然可以粘貼的東西兩次,或去尋找的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
,需要一個二元仿函數形式:
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
,你當然可以使用lambda表達式。我希望你也可以使用<functional>
中的東西構建它,但我不打算。
我還沒有測試過任何這個代碼,所以讓錯誤發現開始吧!
爲什麼'boost :: bind'?這種方法有什麼問題? – kennytm