【一文读不懂C++】Function的应用

简介: 【一文读不懂C++】Function的应用

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就可以随心所欲的用了,要不然就得重新写表达式或者重新绑定了

相关文章
|
6天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
41 9
|
1天前
|
存储 编译器 C++
C++程序变量存储类别:深入理解与应用
C++程序变量存储类别:深入理解与应用
13 1
|
1天前
|
存储 C++
C++程序全局变量:理解与应用
C++程序全局变量:理解与应用
8 0
|
6天前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
17 1
|
6天前
|
Linux 程序员 图形学
C++语言在现代软件开发中的应用与实践
C++语言在现代软件开发中的应用与实践
21 2
|
6天前
|
存储 程序员 C语言
深入理解C++:从语言特性到实践应用
深入理解C++:从语言特性到实践应用
25 3
|
6天前
|
运维 Serverless Go
Serverless 应用引擎产品使用之在阿里云函数计算中c++模板,将编译好的C++程序放进去部署如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
18 1
|
6天前
|
C++
C++:深度解析与实战应用
C++:深度解析与实战应用
13 1
|
6天前
|
安全 vr&ar C++
C++:编程语言的演变、应用与最佳实践
C++:编程语言的演变、应用与最佳实践
|
6天前
|
设计模式 存储 算法
C++从入门到精通:3.7阅读和理解开源项目——在实际项目中应用C++编程技巧和规范
C++从入门到精通:3.7阅读和理解开源项目——在实际项目中应用C++编程技巧和规范

热门文章

最新文章