例えばfor_eachの第3引数ですが、ここは関数オブジェクトを指定します。しかしそれを一々作るのもどうかと思うので、関数があればptr_funで関数オブジェクトを作ってそれを利用します。
#include <iostream> #include <vector> #include <algorithm> using namespace std; void print(int n) { cout << n << " "; } int main() { vector<int> v(3, 1); for_each(v.begin(), v.end(), ptr_fun(print)); }
1 1 1
また、コンテナの要素にそのメンバ関数を作用させる場合は、mem_funまたはmem_fun_refを使います。
class C { int n; public: C(int m) : n(m) { } void print() const { cout << n << " "; } }; int main() { vector<C> v(3, C(1)); for_each(v.begin(), v.end(), mem_fun_ref(&C::print)); }
1 1 1
最近よく思うのですが、クラス内でfor_eachを使うときに第3引数にメンバ関数を指定したいときはどうすればよいのでしょう。
class C { vector<int> v; public: C(int n) : v(3, 1) { } void print_all() const { // ここをfor_eachで書きたい for(vector<int>::const_iterator p = v.begin(); p != v.end(); ++p) print(*p); } void print(int n) const { cout << n << " "; } }; int main() { C c(3); c.print_all(); }
ぼんやり考えていたらさっき思いつきました。
mem_funはコンテナの要素を第1引数とみなすのですね。bind1stを使って第1引数を何か指定すると、コンテナの要素は第2引数になります。すなわち、第1引数にthisを指定すればよいわけです。
void print_all() const { for_each(v.begin(), v.end(), bind1st(mem_fun(&C::print), this)); }
簡単なことだったんですね。
もっともラムダが使えれば何も悩むこともないのですが。
void print_all() const { for_each(v.begin(), v.end(), [&](int n) { print(n); }); }