C++常用新特性: std::bind && std::function

本文介绍了C++11中的std::function和std::bind,std::function是一个通用的多态函数封装器,可以存储、复制和调用任何可调用对象。std::bind则用于函数绑定,它可以绑定各种类型的函数并部分预设参数,返回的函数对象可赋值给std::function。在实际使用中,这两个工具结合可以实现灵活的函数调用和参数处理。
摘要由CSDN通过智能技术生成

1. std::function

类模板 std::function 是通用多态函数封装器。 std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。存储的可调用对象被称为 std::function 的目标。若 std::function 不含目标,则称它为空。调用空 std::function 的目标导致抛出 std::bad_function_call 异常。它满足可复制构造 (CopyConstructible) 和可复制赋值 (CopyAssignable) 。若需要与类非静态成员绑定需要与std::bind结合使用。

2. std::bind

C++11起使用std::bind进行函数绑定,它可以绑定普通函数、全局函数、静态函数、类静态函数甚至是类成员函数,std::bind在绑定时可以绑定一部分参数,未绑定的参数使用占位符,在运行时再传入参数,它的返回值是一个函数对象,可以赋值给std::function对象。

std::bind函数定义如下:
template< class F, class… Args >
/unspecified/ bind( F&& f, Args&&… args );
参数:
F: 可调用 (Callable) 对象(函数对象、指向函数指针、到函数引用、指向成员函数指针或指向数据成员指针)
args: 绑定的参数列表,未绑定参数为命名空间 std::placeholders 的占位符 _1, _2, _3… 所替换

注意:
如可调用 (Callable) 中描述,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向将访问其成员的对象。
到 bind 的参数被复制或移动,而且决不按引用传递,除非包装于 std::ref 或 std::cref 。
允许同一 bind 表达式中的多重占位符(例如多个 _1 ).

3. 使用实例

#include<iostream>
#include<functional>
#include<random>
int Sumfun(int a, int b){
   
  return a+b;
}
template <typename T>
T Sumfun2(T a, T b){
   
  return a+b;
}
struct PrintNum{
   
  void operator()(int num)const{
   
    std::cout<<"PrintNum: "<<num<<std::endl;
  }
};

class Foo{
   
public:
  Foo(int num):num_(num){
   }
  void Print_add(int value)const{
   
    std::cout
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值