以下は、VC2005EEで。
for_eachとmem_funを組み合わせると、コードが少し短くなる。
#include
#include
#include
#includeusing namespace std;
class CInt {
int n;
public:
CInt(int m) { n = m; }
void print() const { cout << n << endl; }
};int main() {
const int n = 5;
vectorv;
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));
なかなか制限が厳しいようだ。