C++マニアック

mem_fun,mem_fun_ref,クラスのメンバ関数を呼び出すテンプレート関数

ページの末尾へ トップページへ

節電しましょう。電力の使用状況グラフ(東電)

mem_fun、mem_fun_ref、クラスのメンバ関数を呼び出すテンプレート関数

mem_fun、mem_fun_ref は、STL の functional の一つで、クラスのメンバ関数を呼び出すためのテンプレート関数です。functional とは、補助関数とでもいう意味でしょう。

  1. mem_fun とは
  2. で、何をするものか
  3. STL 関連本

mem_fun とは ページの先頭へ

まず mem_fun とは、何をするものなのかを解説しましょう。次は、引数の無いメンバ関数 Func0 を持つクラスです。

class CThing {
public:
    int Func0() { return printf("This is Func0\n"); }
};

この関数を呼び出すには、通常次のようにします。

int main() {
    CThing thing;
    thing.Func0();
    return 0;
}

まっ、これで良いのですが、これをちょいとややこしく呼び出してみようというのが mem_fun の目的です。具体的には、次のようにすると、mem_fun を使って、間接的に、メンバ関数を呼び出すことができ、上記と同じ動作をします。

int main() {
    CThing thing;   // ここは、同じ。
    // thing のメンバー関数 Func0 を呼び出す。
    mem_fun(&CThing::Func0)(&thing);	// クラスオブジェクトを引数として与えて、それのメンバ関数を呼び出す。
    return 0;
}

&CThing::Func0 は、メンバ関数を指すポインタです。これは、C 言語のポインタとは概念が異なるので、これに、なじみのない人はクラスメンバへのポインタで少し遊んできてください。

上記のように mem_fun は、ほぼ、クラスのメンバ関数へのポインタを返す関数であるといえます。ちなみに mem_fun_ref は、ポインタではなく、ほぼ、クラスのメンバ関数の参照を返す関数です。正確にいうと、これらは、左で述べたポインタや参照と同等の動作をする関数オブジェクトを返す関数です。

で、何をするものか ページの先頭へ

端的に言えば、mem_fun とは、vector や set などのコンテナに入っている複数のオブジェクトに対して、そのオブジェクトの関数を呼び出すときに使用します。例えば、次の例を見てください。

int main() {
    vector<CThing> vecthing(3);
    // vector に入っている CThing オブジェクトの関数 Func0 を呼び出す。
    for_each(vecthing.begin(), vecthing.end() , mem_fun_ref(&CThing::Func0));
    return 0;
}

これで、CThing の 3 個のそれぞれのオブジェクトの Func0 が呼び出されます。