mem_fun(1)

以下は、VC2005EEで。


for_eachとmem_funを組み合わせると、コードが少し短くなる。


#include
#include
#include
#include

using namespace std;

class CInt {
int n;
public:
CInt(int m) { n = m; }
void print() const { cout << n << endl; }
};

int main() {
const int n = 5;
vector v;
for(int i = 0; i < n; i++)
v.push_back(new CInt(i));

for_each(v.begin(), v.end(), mem_fun(&CInt::print));

for(int i = 0; i < n; i++)
delete v[i];
}

for_eachの3番目の引数は関数オブジェクトだが、mem_funを使うとメンバ関数が関数オブジェクトになる。
for_eachの行は、これを使わないと次のようだろうか。


typedef vector::const_iterator CIT;
for(CIT p = v.begin(); p != v.end(); ++p) {
(*p)->print();
}

少し短くなるだけではあるが。
しかし、メンバ関数がデフォルト引数になると通らなくなる。


// 掛け算して出力
void print(int k = 1) const { cout << n * k << endl; }

このように引数を渡してやれば通る。


for_each(v.begin(), v.end(), bind2nd(mem_fun(&CInt::print), 1));

これで、


void print() const { cout << n << endl; }
void print(int k) const { cout << n * k << endl; }

こうでも、


for_each(v.begin(), v.end(), mem_fun(&CInt::print));

通らない。
これでも通らない。


for_each(v.begin(), v.end(), bind2nd(mem_fun(&CInt::print), 1));

なかなか制限が厳しいようだ。