我认为深刻理解 Lambda 表达式最好的方法就是结合具体的场景多用,个人强烈建议对照这篇文章来理解本文的知识:可调用对象的应用场景
文章目录
对于一个对象或者表达式,如果可以对其使用调用运算符,即。如果a是一个可调用的表达式,则我们可以编写 a(args) ,其中 args 是一个逗号分割的一个或多个参数的列表。
一、函数
//定义函数 add_func
int add_func(int a, int b){
int c = a + b;
return c;
}
//调用函数 add_func
int sum = add_func(3, 5);
二、函数指针
通常我们可以定义一个指向函数的指针,通过这个指针调用特定类型的函数。
demo:
#include <iostream>
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
using pfunc = int(*)(int, int); //定义一个函数指针pfunc
int middle_func(pfunc p, int a, int b){
int result = p(a, b); //通过函数指针类型对象调用函数
return result;
}
int main(){
int a = 2;
int b = 3;
int sum = middle_func(add, a, b); //传入函数 add 给函数指针类型形参
std::cout << a << " + " << b << " = " << sum << std::endl;
}
三、重载了函数调用运算符的类
如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比更加灵活。(函数对象常常用作泛型算法的谓词)
demo:
//不包含状态的函数对象类
struct SortCmp{
int operator()(const std::string& s1, const std::string& s2){
return s1.size() < s2.size();
}
};
std::vector<std::string> words{
"aaa", "aa", "aaaa", "a"};
//对words进行排序,注意传递谓词时要带上调用符,下面是一个错误示范
//std::sort(words.begin(), words.end(), SortCmp); //error
std::sort(words.begin(), words.end(), SortCmp());
demo:
//包含状态的函数对象类
struct Doc{
int id;
std::string doc