#include <iostream> #include <functional> #include <string> class Test? { public: ?? ?Test(int num):num_(num){} ?? ?void operator()(){std::cout<<"call object function:"<< num_ <<std::endl;} ?? ?void print() { std::cout <<"call member function:"<< num_ << std::endl; };
private: ?? ?int num_; };
void print(int num)? { ?? ?std::cout << "call common function:" <<num <<std::endl; }
//std::function 是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理普通函数、成员函数、函数对象(lambda)、函数指针,并允许保存和延迟它们的执行。 int main() { ?? ?//1、std::function 接收并调用一个具有operator()成员函数的类的对象 ?? ?std::function<void()> f1 = Test(1);//临时无名对象 ?? ?f1();//函数模板类调用类对象重载函数 ?? ?//2、std::function 接收并调用类的成员函数【bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数表示对象的地址。】 ?? ?Test test(2); ?? ?std::function<void()>f2 = std::bind(&Test::print, &test); ?? ?f2(); ?? ?void(Test::*pfn)() = &Test::print;//成员函数指针的定义和赋值 ?? ?(test.*pfn)();//pfn为类成员函数指针,所以调用时要通过解引用的方式获取成员函数 * fun, 即(test.*pfn)(); ?? ?std::function<void()>f3 = std::bind(pfn, &test); ?? ?f3();//函数类模板调用函数指针,然后函数指针调用函数 ?? ?std::function<void(Test*)>f4 = pfn;//Test* 表示 成员函数指针pfn所属对象的地址,后可接参数列表 ?? ?f4(&test);函数类模板调用函数指针,然后函数指针调用函数 ?? ?std::function<void(Test*)>f5 = &Test::print;//Test* 表示 成员函数指针pfn所属对象的地址,后可接参数列表 ?? ?f5(&test);//函数类模板调用函数指针,然后函数指针调用函数 ?? ?//3、std::function 接收并调用普通函数指针 ?? ?void(*pfn2)(int) = print; ?? ?pfn2(3);//函数指针调用函数 ?? ?std::function<void()>f6 = std::bind(pfn2,3); ?? ?f6();//函数类模板调用函数 ?? ?std::function<void(int)>f7 = pfn2; ?? ?f7(3);//函数类模板调用函数指针,然后函数指针调用函数 ?? ?//4、lambda表达式创建匿名的函数对象 ?? ?auto mod = [&](int num) { std::cout << "call lambda function:" << num << std::endl; }; ?? ?std::function<void(int)> f8 = mod; ?? ?f8(4); }
|