mem_fn类模板是什么?

mem_fn类模板是C++11引入的一个函数对象适配器。它用于将成员函数转换为函数对象,以便在算法和标准库中使用。

如何使用mem_fn类模板?

要使用mem_fn类模板,需要包含头文件。然后将成员函数传递给mem_fn()模板函数作为参数,返回一个函数对象。可以将返回的函数对象用于算法、函数对象适配器,或者直接调用。下面是使用mem_fn类模板的几个示例:

1. 将成员函数作为谓词传递给标准库算法:

std::vector<int> numbers{1, 2, 3, 4, 5};
 
// 调用成员函数size()作为谓词
auto predicate = std::mem_fn(&std::vector<int>::size);
 
// 使用std::count_if算法查找符合条件的元素个数
int count = std::count_if(numbers.begin(), numbers.end(), predicate);

2. 使用mem_fn类模板包装成员函数,然后通过函数对象适配器std::not1将判断条件翻转:

// 定义一个包含成员函数的类
class Person {
public:
    bool isAdult() const {
        return age >= 18;
    }
 
private:
    int age{21};
};
 
// 将成员函数isAdult()包装为函数对象
auto isNotAdult = std::not1(std::mem_fn(&Person::isAdult));
 
// 使用isNotAdult作为谓词
std::vector<Person> people{Person(), Person()};
int count = std::count_if(people.begin(), people.end(), isNotAdult);

3. 直接调用函数对象:

// 定义一个包含成员函数的类
class Counter {
public:
    void increment() {
        ++count;
    }
 
    int getCount() const {
        return count;
    }
 
private:
    int count{0};
};
 
// 将成员函数increment()包装为函数对象
auto incrementFn = std::mem_fn(&Counter::increment);
 
// 创建一个Counter对象
Counter counter;
 
// 通过函数对象调用increment()函数
incrementFn(counter);
 
// 通过函数对象调用getCount()函数
int count = incrementFn(counter);

mem_fn类模板的特点

使用mem_fn类模板可以很方便地将成员函数转换为函数对象。它的一些特点如下:

1. 可以用于任何可以调用的实体,包括类成员函数、函数指针和函数对象。
2. 可以自动推断实体的参数类型,也可以显式指定参数类型。
3. 可以在函数对象适配器中使用,如std::not1、std::bind等。
4. 可以用于改变成员函数的调用方式,如将成员函数调用改为通过函数对象调用。
5. 可以调用其它重载的成员函数,只需在mem_fn中指定正确的函数指针或成员函数指针类型。