函数对象有这几类:

仿函数类

即重载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);
posted on 2024-03-14 17:06  Getone超  阅读(24)  评论(0编辑  收藏  举报