// mem_fn 有两个重载版本：
// 用法1：mem_fn(&MyClass::printMessage) 用于将成员函数转换为函数对象
// 用法2：mem_fn(&MyClass::printMessage)(&obj, "hello world") 用于调用成员函数
// mem_fn 是一个函数模板，它接受一个成员函数指针或成员函数引用，并返回一个函数对象，该对象可以调用相应的成员函数。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Stu
{
private:
    string name;
    int age;

public:
    Stu(const string &name, int age) : name(name), age(age) {}

public:
    void show()
    {
        cout << "name is " << name << ", age is " << age << endl;
    }
};

int main()
{
    vector<Stu> vs;
    vs.push_back(Stu("disen", 18));
    vs.push_back(Stu("lucy", 20));
    vs.push_back(Stu("jack", 15));
    vs.push_back(Stu("mack", 19));

    // 遍历容器中所有成员，成员函数作为仿函数时，则通过容器成员调用它的仿函数
    for_each(vs.begin(), vs.end(), mem_fun_ref(&Stu::show));

    return 0;
}
