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

std::mem_fun_ref関数と殆ど同じです。

vector等、コンテナに指定されているデータ型がポインタの場合に使うのがstd::mem_fun関数になります。

#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; // 格納する型がCSample*型
    CSample obj[5] = {2,4,6,8,10};
    
    for(int i=0;i<5;++i) {
        v.push_back(&obj[i]);
    }
    
    // std::mem_fun_refからstd::mem_funに変更
    std::for_each(v.begin(),v.end(),std::mem_fun( &CSample::output ));
    
    return 0;
}
$ main
CSapmle::output m_num = 2
CSapmle::output m_num = 4
CSapmle::output m_num = 6
CSapmle::output m_num = 8
CSapmle::output m_num = 10

殆ど一緒ですね。

ちなみに型がポインタになるだけで何故std::mem_fun_refとstd::mem_funを使い分けないとダメになるのかは、指定されたオブジェクトの呼び方を考えれば容易に想像がつきます。

昨日自作したmymem_fun_refの一部を以下に抜粋します。

template<class U> void operator()(const U& obj) {
    (obj.*m_func)();
}

この部分が、ポインタ型の場合は

template<class U> void operator()(const U& obj) {
    (obj->*m_func)();
}

のようにアロー演算子になるので別の処理にしないと無理なんでしょうね。