首先需要了解一个 callable
概念,callable
故名就是可以调用的对象。在 c/c++ 中一共存在以下几种 callable 对象:
1. 函数
void func()
{
}
显然函数名 func
是一个可调用对象
2. 函数指针
func_t func;
上述的 func 指针也是一个可调用对象。
3. 重载 ()
操作符的类
struct Callable
{
public:
void operator()();
};
Callalbe x;
x();
上述类型 Callable
的对象 x 是可调用对象。
4. bind 函数封装的函数对象
// 类的构建函数的初始化参数的一种类似的方式
class range {
public:
bool operator() (int lb, int ub, int val) {
return (lb <=val && val <=ub);
}
};
auto presult = find_if(vec.begin(), vec.end(), \
bind(range{}, 5, 10, placeholders::_1)); //placeholders::_1 here可能代表val,暂不懂
其中bind 产生的函数对象的原型为 bool func(int val)
。bind也可以用于封装函数对象。
5. lambda 表达式
auto f=[](int a,int b){return a>b;};
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:
网友评论