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

相关文章
|
22天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
24天前
|
Java 数据处理
|
5月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
74 1
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
53 2
|
2月前
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
37 9
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
安全 JavaScript 应用服务中间件
【Azure Function App】如何修改Azure函数应用的默认页面呢?
【Azure Function App】如何修改Azure函数应用的默认页面呢?
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
50 2
|
3月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
36 1
|
4月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
52 6

热门文章

最新文章