函数对象有这几类:
仿函数类
即重载operator()
class FuncObjType
{
public:
void operator() ()
{
cout<<"Hello C++!"<<endl;
}
};
std::function类
即上文中func_type
std::function<float(float,float)> func;// 等同于 int (*func)(int a, int b);//func是一个变量
//仿函数赋值
func= std::fmaxf; //等同于func=addFunc;
//一般函数赋值
func=std::bind(&类名::函数名,类对象,_1,_2);
// 存储到成员函数的调用
std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
const Foo foo(314159);
f_add_display(foo, 1);
f_add_display(314159, 1);
std::function做形参
void function(std::function<flaot(float,float)> FUNC, other)
Lambda类
[ 捕获 ] ( 形参列表 )(可选) lambda说明符 { 函数体 }
lambda函数
Lambda 表达式 (C++11 起) - cppreference.com
[ 捕获 ] ( 形参列表 )(可选) lambda说明符 { 函数体 }
捕获
-
[] 什么也不捕获,无法lambda函数体使用任何
-
[=] 按值的方式捕获所有变量,这个值是const类型的,lambda函数体中不可有直接修改这个值的操作
-
[&] 按引用的方式捕获所有变量
-
[=, &a] 除了变量a之外,按值的方式捕获所有局部变量,变量a使用引用的方式来捕获。这里可以按引用捕获多个,例如 [=, &a, &b,&c]。这里注意,如果前面加了=,后面加的具体的参数必须以引用的方式来捕获,否则会报错。
-
[&, a] 除了变量a之外,按引用的方式捕获所有局部变量,变量a使用值的方式来捕获。这里后面的参数也可以多个,例如 [&, a, b, c]。这里注意,如果前面加了&,后面加的具体的参数必须以值的方式来捕获。
-
[a, &b] 以值的方式捕获a,引用的方式捕获b,也可以捕获多个。
-
[this] 在成员函数中,也可以直接捕获this指针,其实在成员函数中,[=]和[&]也会捕获this指针。
案例
int x = 1; int y = 2;
auto plus = [=] (int a, int b) -> int { return x + y + a + b; };
int c = plus(1, 2);