C++11标准库mem_fn类模板怎么使用
mem_fn类模板是什么?
mem_fn类模板是C++11引入的一个函数对象适配器。它用于将成员函数转换为函数对象,以便在算法和标准库中使用。
如何使用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中指定正确的函数指针或成员函数指针类型。
猜您想看
-
如何在Edge浏览器中使用剪贴板历史
在Edge浏览...
2023年05月13日 -
如何进行Electrum比特币钱包的Python代码分析
一、Elect...
2023年05月26日 -
网易云音乐神器,如何利用其打造自己的音乐库?
一、安装网易云...
2023年05月15日 -
如何在 CentOS 7 上创建和配置用户账户?
CentOS ...
2023年04月24日 -
常用的Adb命令有哪些
一、ADB基本...
2023年05月25日 -
如何在软路由中设置 UPnP
软路由UPnP...
2023年04月17日