41項 ptr_fun、mem_fun、およびmem_fun_refの使用理由を理解しよう

ptr_fun、mem_fun、およびmem_fun_refの使用理由を理解しよう



for_eachを呼び出すことを考えます。
メンバ関数を使うときは、下のようなコードになります。

vector<Widget> v;
for_each(v.begin(), v.end(), test); //呼び出し#1 コンパイルされる。

インスタンスのコンテナの各要素のメンバ関数を呼び出すときは、下のように書きますが、コンパイルされません。

vector<Widget> v;
for_each(v.begin(), v.end(), &Widget::test); //呼び出し#2 コンパイルされない。

ポインタのコンテナの各要素のメンバ関数を呼び出すときは、下のように書きますが、これもコンパイルされません。

list<Widget*> l;
for_each(l.begin(), l.end(), &Widget::test); //呼び出し#3 これもコンパイルされない。

原因は、for_eachなどのアルゴリズムメンバ関数のみを想定していることです。


mem_funポインタからのメンバ関数の呼び出しを、非メンバ関数を呼び出す構文に変換します。
mem_funを使えば、呼び出し#3をコンパイルできます。

list<Widget*> l;
for_each(l.begin(), l.end(), mem_fun(&Widget::test)); //呼び出し#3 mem_funを使う

mem_fun_refインスタンスからのメンバ関数の呼び出しを、非メンバ関数を呼び出す構文に変換します。
mem_fun_refを使えば、呼び出し#2をコンパイルできます。

vector<Widget> v;
for_each(v.begin(), v.end(), mem_fun_ref(&Widget::test)); //呼び出し#2 コンパイルされない。