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 コンパイルされない。