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