C++_函数式编程-以及callback函数-回调函数

函数式编程

 函数式编程是一种编程范式,
     它强调程序的构建是通过应用(applying)和组合函数(composing functions)来实现的
     函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用
	 Lambda Calculus
 函数式编程语言
      早期的函数式语言 LISP
	  Erlang, 它由瑞典公司爱立信在20世纪80年代后期开发,最初用于实现容错电信系统.RabbitMQ服务器是用Erlang语言编写的
      工业中使用的函数式编程语言包括多范型的Scala F#,还有Wolfram语言、Common Lisp、Standard ML和 Clojure 等	  
分类
    01.纯函数式编程语言通常不允许直接使用程序状态以及可变对象,
       典型语言有:Miranda、Haskell 和 Idris 等。
    02.非纯函数式编程语言可按类型系统分为两类:
        静态类型语言:ML家族的  Standard ML、OCaml、F#,还有 Scala、Typed Racket[25]等。
        动态类型语言:Lisp家族的 Scheme、Common Lisp、Clojure、Racket,还有LOGO、Erlang、Wolfram语言和 R 等。
    03.其他特殊风格的函数式编程语言有:APL/J和jq等。
概念:Lambda 		
     函数 闭包 (Closure)   纯函数  副作用 惰性计算 
     柯里化 (Haskell Brooks Curry)		
	 函数是一等公民  高阶函数 (Higher-order function) Functions are first-class citizens 
     算子 函数的组合要满足结合律 (associativity)
     函子:Functor	  Monad	
     pipeline 	 递归
	  闭包 (Closure):函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包
	  纯函数:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用
	 高阶函数:

编程

01.元编程范式是一种编程范式,(reflect)
  它允许程序员在运行时创建、修改和操作程序的结构和行为 
02.泛型 : 一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库
         类型推导			 		  

C++ 函数式编程

C++基本:
   函数指针 自由函数,成员函数
C++借鉴了一些函数式编程的思想和方法,并用自己的方式来实现了部分功能
    通过使用高阶函数、闭包等概念来接近函数式编程的理念
    1.lambda
          Lambda表达式的语法是
		     [捕获列表](参数列表) -> 返回类型 {函数体}
    2.函数对象 function objection--就是将函数对象化
      凡是一个类重载了函数运算符(),那么该类的对象就是函数对象,以对象处理函数调用,符合c++面向对象的思维:一切皆为对象;
	  函数对象,也叫仿函数,是一个重载了operator()的类的对象
	3.函数包装器 
	   头文件:#include<functional>
	   C++中的高阶函数通常以模板和对象的形式存在,而不是简单的函数。
	       std::function是一个通用的、多态的函数封装器,
		    std::function是一个类模板,它可以被用来封装所有可调用的目标,包括普通函数、成员函数、函数对象和Lambda表达式
		    它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,包括普通函数、Lambda表达式、函数指针和带有operator()的类等。
		    因此,我们可以说在C++中,高阶函数的概念主要通过std::function来实现
		高阶函数的一个重要应用就是回调函数(Callback Function	
	  std::function提供了完善的接口,如operator(), swap(), target(), target_type()等
    示例:std::function<返回类型(参数类型列表)>		
			
	4. bind 函数适配器  
        bind可以绑定的对象:①普通函数;②lambda表达式;③函数对象;④类的成员函数;⑤类的数据成员	
    5.  关键字 constexpr  auto decltype	
	
	6.STL算法提供了丰富的高阶函数,如transform()、find_if()、accumulate()

回调函数应用场景

    1.遍历容器:C++面向对象编程:如果这个集合是类的私有成员,类的私有成员是不能直接访问的	
      常见的解决办法是在类内部提供一个公有函数,
	     这个公有函数负责对私有集合进行遍历,并且接受一个函数作为参数,这个函数就是我们所说的回调函数(Callback)
         以在类外部通过这个公有函数对私有集合进行遍历,而且可以自由定义每个元素的处理方式	
    2.GUI编程 以及Web处理
	 事件(Event)是由用户操作或系统触发的某种行为,比如鼠标点击、键盘敲击、定时器超时等。
     为了对事件进行处理,我们需要定义事件处理函数(Event Handler),当事件发生时,事件处理函数被调用。			 
     事件驱动的编程模型中,回调函数被广泛用于处理异步事件
	3.算法策略
	   以将每种策略实现为一个函数,然后使用std::function作为回调函数,根据实际情况动态地选择并执行相应的策略

高阶函数

   高阶函数是至少满足下列一个条件的函数:
       - 接受一个或多个函数作为输入
       - 输出一个函数

 std::function作为一个非常灵活的工具,能够以一种统一的方式处理不同的函数接口形态
      使用Lambda表达式作为回调函数
      std::function可以封装几乎任何可调用的目标——无论是普通函数、成员函数,还是函数对象和Lambda函数,都可以被std::function容纳并统一处理

其他

std::forward 是C++11引入的函数模板,它的作用是实现函数参数的完美转发,通俗的讲就是根据传入的参数,决定将参数以左值引用还是右值引用的方式进行转发
简单之处在于理解动机:C++为什么需要完美转发?
复杂之处在于理解原理:完美转发基于万能引用,引用折叠以及std::forward模板函数
  左值右值在函数调用时,都转化成了左值,使得函数转调用时无法判断左值和右值。
    允许程序员更加细粒度的处理对象拷贝时的内存分配问题,提高了对临时对象和不需要的对象的利用率

参考

 C++中的高阶函数:以std::function优雅地实现回调 https://www.cnblogs.com/zzzsj/p/17814609.html
 【C++】C++回调函数基本用法(详细讲解)https://blog.csdn.net/weixin_44244190/article/details/132189809
  CyberRT使用笔记 https://blog.csdn.net/xhtchina/article/details/111587642
posted @ 2024-05-11 13:24  辰令  阅读(30)  评论(0编辑  收藏  举报