メンバ関数アダプタ std::mem_fun_ref関数

http://www.geocities.jp/ky_webid/cpp/library/025.html

例えばvectorのようなクラス型を持つvectorだとして、std::for_each等でそのクラスのメンバ関数を呼びたい場合、通常のやり方ではできません。

そこでメンバ関数アダプタという物を利用します。

#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
using std::cout; using std::endl;

class CSample {
public:
    CSample(int num) { m_num = num; }
    void output () const {
        cout << "CSapmle::output m_num = " << m_num << endl;
    }
private:
    int m_num;
};

int main () {
    std::vector<CSample> v;
    
    for(int i=0;i<5;++i) {
        v.push_back(CSample(i));
    }
    
    std::for_each(v.begin(),v.end(),std::mem_fun_ref( &CSample::output ));
    
    return 0;
}
$ main
CSapmle::output m_num = 0
CSapmle::output m_num = 1
CSapmle::output m_num = 2
CSapmle::output m_num = 3
CSapmle::output m_num = 4

std::mem_fun_refというものを使い、メンバ関数のポインタを渡します。

多分処理的には何も難しいことはしていないと思います。

ちなみに上記のコードはVC6.0だとコンパイルが通らないようです。

std::mem_fun_ref( reinterpret_cast<int (CSample::*)(void)>( &CSample::output ) ) 

とこのように明示的にキャストを書かなければならない上に、戻り値の無いメンバ関数ポインタを指定できないそうです。今のところVC6.0を使うことはないですが注意が必要ですね。