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

相关文章
|
2月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
153 11
人工智能 开发框架 自然语言处理
278 20
|
3月前
|
人工智能 自然语言处理 小程序
VibeCoding On Function AI Deep Dive:用 AI 应用生产 AI 应用
本文介绍了如何通过自然语言构建AI应用,展示了使用VibeCoding技术实现儿童教育、娱乐及企业网站智能问答等场景的实战案例。无需编程,仅凭对话即可完成开发、发布,体现了AI时代软件开发的变革与创新。
|
9月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
277 15
|
10月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
370 12
|
11月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
363 5
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
276 5
|
Java 数据处理
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
383 9
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
240 2

热门文章

最新文章