标准仓库
#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()成员函数
模板
模板实例化-- 声明-定义--使用 编译器。
模板特例化--当定义函数模板的特例化版本时,我们本质上接管了编译器的工作
我们为原模板的一个特殊实例提供了顶级--一个特例化版本本质是一个实例,而非函数名的一个重载版本
定义为特例化版本还是一个独立的非模板函数--会影响到函数匹配