functional仿函数,函数对象
function底层分配机制:暴力malloc,实时分配性能低下。
std::function<int(int, int)> f = lambda/普通函数/类函数/函数对象/模版函数/bind/
一、标准库中的常用函数对象
-
std::bit_or
-
std::equal_to
-
std::plus
-
std::bind2nd
-
std::bind -> placeholders
-
std::greater
-
std::less
二、仿函数的优点
-
仿函数是对象,可以拥有成员函数和成员变量,即仿函数拥有状态(states)
-
每个仿函数都有自己的类型
-
仿函数通常比一般函数快(很多信息编译期确定)
三、仿函数(std::function)和函数指针
仿函数是一个类,是数据以及对数据操作的行为的集合,要成为仿函数必须重载()
。函数指针是无法保存数据的,所以仿函数比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。
转载:std::function和std::bind的使用 讲的挺全面
#include <iostream>
#include <functional>
int add(int a, int b)
{
return a + b;
}
int main()
{
typedef int(*fun)(int, int); //函数指针,指针名:fun,参数为:int,int返回值为:int
std::function<int(int, int)> b; //std::function仿函数,函数对象名:b,参数为:int,int返回值为:int
fun a = add;
b = add;
std::cout << a(2, 3) << '\n';
std::cout << b(3, 4) << '\n';
return 0;
}
std::function指向类成员函数,静态成员函数和普通函数用法一致。
#include <functional>
class Test {
public:
int fun(int x, int y)
{
return x + y;
}
};
int main()
{
Test test;
// 方式1:fun1的类型可以为auto
std::function<int(int, int)> fun1 = std::bind(&Test::fun, test,std::placeholders::_1, std::placeholders::_2);
int result1 = fun1(1, 2);
// 方式2:fun2的类型必须明确指定,不能为auto
std::function<int(Test, int, int)> fun2 = &Test::fun;
int result2 = fun2(test, 1, 2);
return 0;
}
四、std::function和std::bind
std::bind std::mem_fn std::invoke
std::function是一个类,std::bind是一个函数(具体可以看functional头文件中的定义)
std::function是函数对象,std::bind生成一个函数对象。