mem_fun, mem_fun_ref, bind的总结

1. C11 中的mem_fun相关知识

函数作用
mem_fun把成员函数转为函数对象,使用对象指针或对象(引用)进行绑定
mem_fun_ref把成员函数转为函数对象,使用对象(引用)进行绑定
bindstd::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中使用当前类的成员函数和成员变量。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值