mem_funの使い方

例えば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); });
    }