谈function
2021-12-10 本文已影响0人
404Not_Found
- 作者: 雪山肥鱼
- 时间:20211211 11:23
- 目的: 复习 function
function
语义:
类模板 std::function 是可调用对象的包装器,可以包装除了类成员函数之外的所有可调用对象。包括,普通函数,函数指针,lambda,放函数。
通过指定的模板参数,它可以用统一的方式保存,并延迟执行执行,即回调。
多态统一接口
-
统一接口
在之前 我们可以用多态统一接口。
#include <iostream>
using namespace std;
class Oper{
public:
virtual int op(int x, int y) = 0;
};
class Add : public Oper {
public:
int op()(int x, int y) {
return x +y;
}
};
class Sub : public Oper{
public:
int op()(int x, int y) {
return x -y;
}
};
int main(int argc, char *argv[])
{
Add add;
cout<<add.op(4,5)<<endl;
Sub sb;
cout<<sb.op(5, 4)<<endl;
return 0;
}
function 统一接口
我们针对 函数,函数指针,lambda,仿函数分别举例。
#include <iostream>
#include <functional>
#include <map>
int add(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x -y;
}
typedef int(*SUB)(int x, int y);
class Div {
public:
int operator()(int x, int y) {
return x/y;
}
};
int main(int argc,char **argv) {
auto op = function<int(int, int)>(add);
cout<<op(1,4)<<endl;
SUB sb = sub;
auto op1 = function<int(int, int)>(sb);
cout<<op1(3,4)<<endl;
auto op2 = function<int(int, int)>([](int x, int y){
return x * y;
});
cout<<op2(3,4)<<endl;
auto op3 = function<int(int, int)>(Div());
cout<<op3(10, 2)<<endl;
map<string, function<int(int, int)>> mp = {
{"+", add}, //函数
{"-", sb}, //函数指针
{"/", op3}, // 仿函数
{"*", op2} //lambda
};
cout<<mp["+"](1,2)<<endl;
cout<<mp["-"](1,2)<<endl;
cout<<mp["/"](44,2)<<endl;
cout<<mp["*"](10,2)<<endl;
return 0;
}
简单应用
- 做回调函数
#include <iostream>
#include <algorithm>
#include <functional>
#include <map>
void selectSort(int *p, int n, function<int(int, int)> compare) {
for(int i = 0; i < n-1; i++) {
for( int j = i+1; j<n;j++) {
if(compare(p[i], p[j])) {
p[i] ^= p[j];
p[j] ^= p[i];
p[i] ^= p[j];
}
}
}
}
int main(int argc, char ** argv) {
int arr[] = {1,3,5,7,9,2,4,6,8,10};
selectSort(arr, sizeof(arr)/sizeof(*arr), [](int x, int y){return x > y;});
for_each(arr, arr+10, [](int &i) {
cout <<i<<endl;
});
return 0;
}
- 类成员回调
class FunA {
public:
void operator()() {
cout <<"class function A"<<endl;
}
};
class FunB {
public:
void operator()() {
cout <<"class function B"<<endl;
}
};
class FunC {
public:
void operator()() {
cout <<"class function C"<<endl;
}
};
class Obj {
public:
Obj(FunA a, FunB b, FunC c) {
_list.push_back(a);
_list.push_back(b);
_list.push_back(c);
}
void notify() {
for(auto &item:_list) {
item();
}
}
private:
list<function<void(void)>> _list;
};
int main(int argc, char ** argv) {
FunA a;
FunB b;
FunC c;
//可以推任何可调用对象
Obj ob(a, b, c);
ob.notify();
return 0;
}