1.function的应用
#include <iostream> #include <vector> #include <vector> #include <functional> #include <algorithm> #include <ctime> using namespace std; void hello1() { cout << "hello" << endl; } void hello2(string s) { cout << s << endl; } int sum(int a, int b) { cout << a + b << endl; return a + b; } class Test { public: //类的成员函数调用必须依赖一个对象void (Test::::*pfunc)(string) void hello(string str) { cout << str << endl; } }; int main() { // 从function的类模板定义处,看到希望用一个函数类型实例化function function<void()> func1 = hello1; func1(); function<void(string)> func2 = hello2; func2("hello2"); function<int(int, int)> func3 = sum; func3(1, 2); // operator() function<int(int, int)> func4 = [](int a, int b)->int {return a + b; }; cout << func4(100, 200) << endl; // 因为成员函数的参数里面都有用一个指向自己的指针,也就是Test* function<void(Test*, string)> func5 = &Test::hello; // 对于成员方法的调用,是要指向一个对象的,也就是&Test() Test t; func5(&t, "hello test!"); return 0; } // 总结 //1.function<函数类型>,用函数类型实例化function //2.function<函数类型(参数)> func1 使用时候也是得func1(参数)
2.function 的好处
那说了这么多,function的好处到底是哪里呢,为什么我要这样子干,而不是直接调用函数呢
好处就是它能把看到的各种类型保存下来
比如
func1 = hello1;
func4 = [](int a, int b)->int {return a + b; };
func5 = &Test::hello;
它能把函数,lambda表达式,成员函数的类型保存下来
举个例子,比如图书馆里系统图
int main() { int choice = 0; for (;;) { cout << "----------------" << endl; cout << "1.查看所有书籍信息" << endl; cout << "2.借书" << endl; cout << "3.还书" << endl; cout << "4.查询书籍" << endl; cout << "5.注销" << endl; cout << "----------------" << endl; cout << "请选择:" << endl; cin >> choice; } switch (choice) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; default: break; } }
但是这个代码不好,因为无法闭合,无法做到开闭原则,每次新增加一个功能 都要把switch里面的都改一下
我们可以把每件事情的功能都封装到一个函数里
void doShowAllBook() { cout << "查看所有书籍信息" << endl; } void doBorrow() { cout << "借书" << endl; } void doBack() { cout << "还书" << endl; } void doQueryBooks() { cout << "查询书籍" << endl; } void doLoginOut() { cout << "注销" << endl; } int main() { int choice = 0; map <int, function<void()>> actionMap; actionMap.insert({ 1, doShowAllBook }); actionMap.insert({ 2, doBorrow }); actionMap.insert({ 3, doBack }); actionMap.insert({ 4, doQueryBooks }); actionMap.insert({ 5, doLoginOut }); for (;;) { cout << "----------------" << endl; cout << "1.查看所有书籍信息" << endl; cout << "2.借书" << endl; cout << "3.还书" << endl; cout << "4.查询书籍" << endl; cout << "5.注销" << endl; cout << "----------------" << endl; cout << "请选择:" << endl; cin >> choice; auto it = actionMap.find(choice); if (it == actionMap.end()) { cout << "failed" << endl; } else { it->second(); } } }
有人说那函数指针也可以做到呀,但是我们这里只是用了函数,那要是有lambda,有函数绑定怎么办呢,对吧,所以还是用function靠谱,可以返回任何的类型。
像lambda表达式只能作用在语句中,而有了function就可以随心所欲的用了,要不然就得重新写表达式或者重新绑定了