? 类模板?std::function?是通用多态函数包装器。?std::function
?的实例能存储、复制及调用任何可复制构造?(CopyConstructible)?的可调用?(Callable)?目标——函数(通过其指针)、?lambda 表达式、?bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
目录
void func(int A) { std::cout<<A<<std::endl; } // 统一函数对象的封装形式: 把函数对象看成一个变量 std::function<void(int)> f1=func; f1(20);
? ? ? ? 什么是仿函数: 定义一个类,类里面重载函数运算符(),将该类的对象作为函数的入参,那么在函数中同样能调用重载符()里面的方法
class Func { public: ? ? void operator()(int a){std::cout<<a<<std::endl;} }; // 统一函数对象的封装形式: 把仿函数对象看成一个变量 std::function<void(int)> f2=Func(); f2(23);
class Test { public: Test(){ } Test(int numb):m_numb(numb){} int add(int a,int b,int c )const { return a+b+c; } private: int m_numb; }; //类内的方法, /** * 对类内成员的函数,依赖于类的对象,所以需要一个类的对象 */ std::function<int(const Test&, int,int,int)>f = &Test::add; Test t; std::cout<<f(t,2,3,4)<<std::endl;
? ? ? ?注意:
?using namespace std; 全局使用注意事项
? ? ? ? 在C库和C++库中,出现同名的情况下,使用using namespace std;//标准库
? ? ? ? 会导致,无法使用C库的函数,所以在项目中少用全局标准库std
//bind类内成员函数时,改变调用接口的参数个数 Test test_canshu; auto f_class_canshu = std::bind(&Test::add,&test_canshu,std::placeholders::_1,std::placeholders::_2,0); std::cout<<f_class_canshu(1,2)<<std::endl;
// 绑定类外接口 // 使用bind,和占位(placeholders) 配合使用,灵活控制参数的个数 auto add_f = std::bind(add,std::placeholders::_1,std::placeholders::_2, 0); add_f(4,7); //两数相加
// 绑定仿函数 // 把一函数变成另一个函数 auto f_operator = std::bind(Func(),std::placeholders::_1); f_operator(5); f_operator(6);