1. C11 中的mem_fun相关知识
函数 | 作用 |
---|---|
mem_fun | 把成员函数转为函数对象,使用对象指针或对象(引用)进行绑定 |
mem_fun_ref | 把成员函数转为函数对象,使用对象(引用)进行绑定 |
bind | std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表 |
2. 1 std::bind
可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:
•将可调用对象和其参数绑定成一个防函数;
•只绑定部分参数,减少可调用对象传入的参数
2.2 std::function
•std::function 是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
•定义格式:std::function<函数类型>。
•std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。
3. 占位符std::placeholders
std::placeholders 定义如下:
namespace placeholders {
extern /* unspecified */ _1;
extern /* unspecified */ _2;
extern /* unspecified */ _3;
// ...
}
示例如下:
class Object {
public:
void hello(const std::string& s)
{
std::cout << "Hello " << s << '\n';
}
};
int main(int argc, char* argv[])
{
typedef std::function<void(const std::string&)> ExampleFunction;
Object instance;
std::string str("World");
ExampleFunction f = std::bind(&Object::hello, &instance,
std::placeholders::_1);
// equivalent to instance.hello(str)
f(str);
}
4 Lambda 匿名函数,简洁之道
lambda表达式是C++11非常重要也是很常用的特性之一,来源于函数式编程的概念,也是现代编程语言的一个特点。它有如下特点:
•声明式编程风格:就地匿名定义目标函数或者函数,不需要额外写一个命名函数或者函数对象,以更直接的方式写程序。
•简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散。
•在需要的时间和地点实现功能闭包,使程序更加灵活。
捕捉
lambda表达式可以通过捕获列表捕获一定范围内的变量:
•[]不捕获任何变量;
•[&]捕获外部作用域所有变量,并作为引用在函数体使用(按引用捕获);
•[=]捕获外部作用域作用变量,并作为副本在函数体使用(按值捕获);
•[=,&foo]按值捕获外部作用域所有变量,并按引用捕获foo变量;
•[bar]按值捕获bar变量,同时不捕获其他变量;
•[this]捕获当前类中的this指针,让lambda拥有和当前类成员函数同样的访问权限,如果已经使用了&或者=,就默认添加此选项。
捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量。