C++_仿函数

标准仓库

#include <memory>      std::unique_ptr   std::shared_ptr
#include <functional>  std::function     std::bind
#include <utility>     std::forward	    std::move    std::forward是C++11引入的函数模板,它的作用是实现函数参数的完美转发
#include <thread>      std::thread
#include <future>      std::future       std::aysnc   std::promise 
#include <mutex>       std::mutex        std::lock_guard
#include <shared_mutex>std::shared_mutex std::shared_lock std::unique_lock
#include <atomic> 
#include <condition_variable>
#include <iostream> #include <fstrean>  #include<stringstream>
#include<string>
#include<vector>
#include<unordered_map>

标准仓库详情

C++中,可调用对象(Callable Object)是一个可以被调用执行的对象
       可调用对象:   函数  函数指针  重载了函数调用符的类  lambda  bind创建的类型
	   调用形式: 
	       函数类型--参数类型和返回值类型
		不同的可调用对象可能拥有相同的调用形式:
		    使用map的形式化--来找到对应的操作形式--函数表
		std::fuction  是一个类模板,需要提供额外的信息,这些信息是调用的形式
		    形成一个新的可调用的std::function对象
函数指针  仿函数  lambda
    函数指针是指向函数的指针
	成员函数指针--指向类成员函数的指针,需要与一个对象实例一起使用
	仿函数是一种拥有 operator() 的 类对象,可以被当作函数来调用 类中重载operator()-该类的实例,该类的对象
	           任何可以通过 函数调用运算符() 被调用的对象 
			   在算法库中,如std::sort或std::for_each等算法可以接受自定义的函数对象作为参数,以定义特定的行为。此外,函数对象也常用于实现回调和绑定事件
			   以容纳除了类成员函数指针之外的所有可调用对象--可以想使用函数一样使用该类的对象 (该类可以存储状态)
			   operator() 成员函数,可以有多个,参数个数或者类型要有所不同  这个类会包含成员变量
	lambda表达式  lambda是函数对象--匿名函数对象  具名函数对象
	             匿名函数对象,且仅有一个成员函数 即 operator()  捕获引用--类似于 成员变量的功能提供状态
常规:
  函数指针 最广泛的应该就是先定义函数指针的类型,然后在声明一个函数指针的变量作为另一个函数的入参,以此作为回调函数	 它只能指向全局或静态函数
  std::function	 指向全局和静态函数,还可以指向彷函数,lambda表达式,类成员函数,
             是一个泛型函数包装器,可以存储、复制和调用任何类型的可调用对象
std::function
    std::function 是通用多态函数封装器	  C++中,高阶函数的概念主要通过std::function来实现 在C++中,可以借助于函数对象或者函数指针来实现高阶函数 
	  工厂模式--
	  能够以一种统一的方式处理不同的函数接口形态
std::bind 创建的绑定表达式可以存储一个可调用对象及其参数,并在之后被调用
    std::bind看作一个通用的函数适配器,
	   它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表
	   
std::function 通用多态函数封装器
   map<string, std::function<int(int,int)>> binops ={
      {"+",add},
	  {"-",std::minus<int>()},
	  {"/",divide()},
	  {"*",[](int i,int j){return i*j}},
	  {"%",mod}
	 }   

std::bind()
  01.传统C/C++实现回调,主要通过函数指针来实现
  02. std::bind 允许你将一个函数的参数预先绑定(即部分应用),或者在调用时延迟指定某些参数。这对于实现回调函数非常有用,
    尤其是在需要延迟调用或者传递函数作为参数给其他函数时
	  // 绑定非类成员函数/变量
        auto f = std::bind(可调用对象地址, 绑定的参数/占位符);
        // 绑定类成员函/变量
        auto f = std::bind(类函数/成员地址, 类实例对象地址, 绑定的参数/占位符);
		  std::placeholders::_1是占位符。它们占据了传递给函数的参数的位置。_1为第一个参数,_2为第二个参数,以此类推。
          进行bind的时候,也可以不使用placeholders占符,直接传入具体的参数
		    值
			按引用传递,需要使用std::ref
			
	std::bind利用模板参数推导和函数重载的技术,将可调用对象与其参数进行绑定,生成一个std::function对象或者一个可调用的函数对象。
	  它通过模板特化和变参模板的方式,实现了对各种类型的可调用对象和参数的支持
	std::bind(&Printer::print, &printer, std::placeholders::_1);    成员函数绑定
	std::bind(&Printer::callback, this, std::placeholders::_1);    延迟调用 
	
将可调用对象和其参数绑定成一个仿函数;
将多元(参数个数为n,n-1)可调用对象转换成一元或者(n-1)元可调用对象,即只绑定部分对象。	
	
类的实例--对象 是对象而不是函数

设计模式

 AbstractProduct
 Product1  Product2 ……	 
 Factory
 client
std::string类中 , 封装了一个c_str()成员函数 , 用于返回一个指向字符串内容的常量字符指针 ; 将string 转为 char* 类型 , 就需要调用c_str()成员函数 

模板

模板实例化-- 声明-定义--使用  编译器。
 模板特例化--当定义函数模板的特例化版本时,我们本质上接管了编译器的工作	
     我们为原模板的一个特殊实例提供了顶级--一个特例化版本本质是一个实例,而非函数名的一个重载版本
	    定义为特例化版本还是一个独立的非模板函数--会影响到函数匹配
posted @ 2025-04-29 18:18  辰令  阅读(44)  评论(0)    收藏  举报