波奇学C++:functional包装器和智能指针(一)

news/2024/12/23 0:48:18/

functional包装器

相当于适配器,用于对可调用对象(函数指针,仿函数,lambda)进行封装,使得他们的类型统一。

double func(double d)
{return d / 4;
}
struct func1
{double operator()(double d){return d / 4;}
};
int main()
{function<double(double)> f1 = [](double d) {return d / 4; };function<double(double)> f2 = func;function<double(double)> f3 = func1();return 0;
}

function<return-type(parameter-type)> = lambda/函数指针/仿函数匿名对象

包装后的对象可以放在容器中,并调用。

vector<function<double(double)>> v = { f1,f2,f3 };
for (auto e : v)
{cout << e(4) << endl;
}

functional 的 bind绑定

bind绑定

从传参的角度对封装好的可调用对象进一步限制

改变参数对应位置

int Sub(int a, int b)
{return a - b;
}function<int(int, int)> rSub = bind(Sub, placeholders::_1,placeholders::_2);
cout << rSub(10, 5) << endl; // 5
function<int(int, int)> rrSub = bind(Sub, placeholders::_2, placeholders::_1);
cout << rrSub(10, 5) << endl; // -5

rSub的10 对应_1,_1对应a

rrS 的 10 对应_1,  _1 对应b

减少传参

int Add(int a, int b,int rate)
{return (a - b)*rate;
}
function<int(int, int)> radd = bind(Add, placeholders::_1, placeholders::_2,10);
cout << radd(10, 5) << endl; //(10-5)*10

 Add经过封装后参数只剩下a,b,rate的值被限定成10

function<int(int, int)> radd = bind(Add, placeholders::_1, 10,placeholders::_2);
cout << radd(10, 5) << endl; // 0

由此可见,bind里面的_1,_2 和函数是以相对位置映射的,而调用时radd的参数顺序和_1数字编号有关和位置顺序无关。

bind绑定类域中的函数

class A
{
public:static int add(int a, int b){return a + b;}int aadd(int a, int b){return a + b;}
};function<int(int,int)> rfunc1 = bind(&A::add, placeholders::_1, placeholders::_2); 
// 静态成员函数
A a; 
function<int(int, int)> rfunc2 = bind(&A::aadd,&a, placeholders::_1, placeholders::_2);
function<int(int, int)> rfunc3 = bind(&A::aadd, A(), placeholders::_1, placeholders::_2);
// 成员函数实际三个参数,this,因此我们可以传对象指针或者匿名对象

bind的第一个参数实际上是函数地址,底层上bind绑定是仿函数。

智能指针

利用类对象的构造和析构函数来控制指针的生成和释放,即RAII

template<class T>
class SmartPtr
{
public:SmartPtr(T* ptr):_ptr(ptr){}~SmartPtr(){cout << "delete pointer"<<_ptr << endl;}
private:T* _ptr;
};
void test()
{SmartPtr<string> ptr(new string());
}

当test函数结束时,会调用析构函数释放指针。

智能指针的重载符号

class SmartPtr
{
public:SmartPtr(T* ptr):_ptr(ptr){}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}~SmartPtr(){cout << "delete pointer"<<_ptr << endl;}
private:T* _ptr;
};


http://www.ppmy.cn/news/1252659.html

相关文章

3D云参观红色革命纪念馆允许更多人在线交流、体验

生活在和平年代的新一代青少年&#xff0c;可能对革命先烈英勇事迹难以有很深的体会&#xff0c;无法切实感受到中国共产党无畏牺牲、誓死保家卫国的红色精神&#xff0c;因此借助VR虚拟现实制作技术&#xff0c;让参观者们走近革命先烈中&#xff0c;感受老一辈无产阶级革命家…

2023.11.30-12.1我的发烧全过程

记录一下这糟糕的体温变化&#xff1a; &#xff08;昨天下午是在教室学随机过程的时候发现教室很热&#xff1b;今天下午又是在宿舍学嵌入式开发的时候发现不对劲&#xff0c;所以&#xff09; 11.30的17&#xff1a;30------38.1度&#xff08;吃了一粒布洛芬&#xff09;11…

Redis 命令处理过程

我们知道 Redis 是一个基于内存的高性能键值数据库, 它支持多种数据结构, 提供了丰富的命令, 可以用来实现缓存、消息队列、分布式锁等功能。 而在享受 Redis 带来的种种好处时, 是否曾好奇过 Redis 是如何处理我们发往它的命令的呢&#xff1f; 本文将以伪代码的形式简单分析…

【错误记录】Python 错误集合

Python 错误集合 文章目录 Python 错误集合TypeError: list object cannot be interpreted as an integer python 常见错误集合&#xff1a;持续更新 TypeError: ‘list’ object cannot be interpreted as an integer map [ [1, 1, 1, 1, 1, 1, 1, 0, 1, 1],[1, 0,…

理解BatchNormalization层的作用

深度学习 文章目录 深度学习前言一、“Internal Covariate Shift”问题二、BatchNorm的本质思想三、训练阶段如何做BatchNorm四、BatchNorm的推理(Inference)过程五、BatchNorm的好处六、机器学习中mini-batch和batch有什么区别 前言 Batch Normalization作为最近一年来DL的重…

SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离

一、项目简介 本项目是一套基于SpringBoot实现大学生健康档案管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…

C语言贪吃蛇(有详细注释)

这个贪吃蛇是在比特特训营里学到的&#xff0c;同时我还写了用EasyX图形库实现的图形化贪吃蛇&#xff0c;含有每个函数的实现以及游戏中各种细节的讲解&#xff0c;感兴趣的可以去看一看。 贪吃蛇小游戏 实现效果 以下就是源码&#xff0c;感兴趣的小伙伴可以cv自己玩一玩改…

淘宝/天猫商品详情API接口丨京东商品详情丨1688商品详情丨接口key密钥获取方式

要获取淘宝/天猫商品详情API接口、京东商品详情API接口、1688商品详情API接口以及接口密钥&#xff08;Key&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 注册并登录淘宝/天猫开发者中心或京东开放平台或1688开放平台&#xff0c;并创建应用。在创建应用的过…