当前位置: 首页 > news >正文

银川 网站建设长沙网站推广公司

银川 网站建设,长沙网站推广公司,彩票走势网站怎么做的,数据图表展示网站简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之lambda匿名函数、typedef、using等用法

2.C++之lambda匿名、using、typedef介绍

1.lambda介绍

  • Lambda函数是一种匿名函数,可以在C++中使用。它提供了一种简洁的方式来定义和使用临时的函数对象。Lambda函数通过使用方便的语法来简化函数对象的创建过程,使代码更加简洁和易读。

Lambda函数的基本语法如下:

[capture list] (parameters) -> return_type { function_body }
  • Capture列表:指定Lambda函数所捕获的外部变量。它可以是值捕获(通过值进行拷贝)或引用捕获(通过引用进行访问)的方式。
  • 参数列表:指定Lambda函数的参数。
  • 返回类型:指定Lambda函数的返回类型(可以省略,编译器会自动推断)。
  • 函数体:实现Lambda函数的具体逻辑。

3.lambda匿名、using、typedef介绍

  1. Lambda匿名函数:
    Lambda函数是一种匿名函数,允许我们在需要函数对象的地方定义临时的、即时的函数逻辑。它的语法如下:
[capture list] (parameters) -> return_type { function_body }
  • Capture列表(可选): 指定Lambda函数所捕获的外部变量。
  • 参数列表: 指定Lambda函数的参数。
  • 返回类型(可选): 指定Lambda函数的返回类型。如果不指定,则编译器会自动推断。
  • 函数体: 实现Lambda函数的具体逻辑。

Lambda函数可以用于算法函数、STL容器的处理、回调函数等地方,可以使代码更加简洁和易读。

  1. using声明:
    Using声明在C++中用来引入一个特定的类型或命名空间,以便在当前作用域中使用。它的语法如下:
using name = type;

这里的name是我们定义的别名,type是需要引入的类型。

Using声明可以用来简化复杂的类型名称,或者引入命名空间中的类型。例如:

using IntVector = std::vector<int>;IntVector numbers = {1, 2, 3, 4, 5};

这里,我们使用了using声明引入了std::vector<int>类型的别名IntVector,从而将其简化为更易读的名称。

  1. typedef声明:
    Typedef声明也是用来引入一个特定的类型别名,以便在当前作用域中使用。它的语法如下:
typedef type name;

这里的type是我们需要引入的类型,name是我们定义的别名。

Typedef声明的作用和using声明类似,它也可以用来简化复杂的类型名称。例如:

typedef std::vector<int> IntVector;IntVector numbers = {1, 2, 3, 4, 5};

这里,我们使用了typedef声明将std::vector<int>类型定义为IntVector,从而使代码更加易读。

总结:
Lambda函数提供了一种简洁的方式来定义匿名函数,using声明和typedef声明提供了简化类型名称的能力。这些工具可以使代码更加清晰、易读和易于维护。

3.代码实例

v1.0 函数调用实例

#include <iostream>
#include <string>
#include <functional>typedef std::function<int(int x, int y)> Callback ;
using UCallback = std::function<int(int x, int y)> ;//v1.0
int call_add(std::function<int(int x, int y)> call){int a = 100, b=500;call(a, b);//传值a,b给调用者.return a+b;
}//v2.0: 与以上等同:使用typedef定义Callback类型别名定义
int call_add_01(Callback call){int a = 100, b=500;call(a, b);//传值a,b给调用者.return a+b;
}//v3.0: 与以上等同:使用using定义UCallback类型别名定义
int call_add_02(UCallback call){int a = 100, b=500;call(a, b);//传值a,b给调用者.return a+b;
}int main() {//v1.0:匿名lambda函数,无参数,无返回值.[](){printf("xxx----->%s(), line = %d\n",__FUNCTION__,__LINE__);}();//v2.0:匿名lambda函数,带string参数,无返回值.[](std::string content){printf("xxx----->%s(), line = %d, content = %s\n",__FUNCTION__,__LINE__,content.c_str());}("Hello Wolrd.");//v3.0:匿名lambda函数,带string和int类型参数,无返回值.std::string buf = "Hello, C++!";int year = 2023;[](std::string buf, int years){printf("xxx----->%s(), line = %d, buf = %s, years = %d\n",__FUNCTION__,__LINE__,buf.c_str(), years);}(buf, year);//v3.1: lambda带返回值int moth = [](std::string buf, int years){printf("xxx----->%s(), line = %d, buf = %s, years = %d\n",__FUNCTION__,__LINE__,buf.c_str(), years);int month = 10;return month;}(buf, year);printf("xxx----->%s(), line = %d, moth = %d\n",__FUNCTION__,__LINE__,moth);//4.0: 使用typedef创建别名类型Callback,然后调用回调函数.Callback add = [](int a, int b)->int {printf("xxx---------->%s(), line = %d, a = %d, b = %d\n",__FUNCTION__,__LINE__,a,b);return a + b;};printf("xxx----->%s(), line = %d, add = %d\n",__FUNCTION__,__LINE__,add(2, 3));//v5.0: 使用typedef定义回调函数类型别名int ret1 = call_add(add);printf("xxx----->%s(), line = %d, ret1 = %d\n",__FUNCTION__,__LINE__,ret1);//v6.0: 直接使用lambda匿名回调函数int ret2 = call_add([](int x, int y)->int{return x + y;});printf("xxx----->%s(), line = %d, ret2 = %d\n",__FUNCTION__,__LINE__,ret2);//v7.0: 使用typedef定义回调函数类型别名int ret3 = call_add_01(add);printf("xxx----->%s(), line = %d, ret3 = %d\n",__FUNCTION__,__LINE__,ret3);//v8.0: 使用using定义回调函数类型别名int ret4 = call_add_02(add);printf("xxx----->%s(), line = %d, ret4 = %d\n",__FUNCTION__,__LINE__,ret4);//v9.0: 直接使用lambda匿名回调函数int ret5 = call_add_02([](int x, int y)->int{return x + y;});printf("xxx----->%s(), line = %d, ret5 = %d\n",__FUNCTION__,__LINE__,ret5);return 0;
}

v2.0 类指针、引用、指针的引用实例01

#include <iostream>
#include <string>
#include <memory>
#include <functional>class TEST{
public:void log(){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}TEST(){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}TEST(std::shared_ptr<TEST> &test){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};//1.typedef定义:typedef 类型 别名.
typedef std::function<void(std::shared_ptr<TEST> &test)> Callback ;
//2.using定义:using 别名 = 类型.
using UCallback = std::function<void(std::shared_ptr<TEST> &test)> ;void callback_test(std::function<void(std::shared_ptr<TEST> &test)> func){std::shared_ptr<TEST> tt = std::make_shared<TEST>();func(tt);
}int main() {//v1.0: lambda匿名函数返回指针TEST*类型,无参数TEST *t1 = [&]()->TEST*{return new TEST;}();t1->log();//v1.1TEST *t12 = [&]()->TEST*{return new TEST;}();t12->log();//2.0: lambda匿名函数返回TEST类型指针对象,无参数TEST t2 = [&]()->TEST{return TEST{}; //TEST{}创建对象方式}();t2.log();//v2.1: TEST()创建对象方式TEST t21 = [&]()->TEST{return TEST();}();t21.log();//3.0: lambda匿名函数返回TEST类型指针对象,无返回值TEST *t3;[&](TEST *tr){tr = new TEST;}(t3);t3->log();//4.0: lambda匿名函数返回TEST类型指针的引用对象,无返回值TEST *t4;[&](TEST* &tr){//指针的引用tr = new TEST();}(t4);t4->log();//5.0: lambda匿名函数返回TEST类型shared_ptr指针对象,无返回值std::shared_ptr<TEST> t5;[&](std::shared_ptr<TEST> tr){//指向TEST类型shared_ptr指针对象tr = std::make_shared<TEST>();}(t5);t5->log();//6.0: lambda匿名函数返回TEST类型shared_ptr指针的引用对象,无返回值std::shared_ptr<TEST> t6;[&](std::shared_ptr<TEST> &tr){//指向TEST类型shared_ptr指针的引用的对象,即make_shared<TEST>()指针对象的别名.tr = std::make_shared<TEST>();}(t6);t6->log();//7.0: lambda匿名函数返回TEST类型shared_ptr指针的引用对象std::shared_ptr<TEST> t7;[&](std::shared_ptr<TEST> &tr)->std::shared_ptr<TEST> {//指向TEST类型shared_ptr指针的引用的对象,即make_shared<TEST>()指针对象的别名.//tr = std::make_shared<TEST>();return std::make_shared<TEST>(tr);}(t7);t7->log();//8.0: lambda匿名函数返回TEST类型shared_ptr指针的引用对象,有返回值和参数./*t8和t8.get()区别:t8是一个std::shared_ptr<TEST>类型的共享指针,指向一个TEST对象.t8.get(): 返回的是一个指向同一对象的原始指针.*/std::shared_ptr<TEST> t8;[&](void* tr) -> std::shared_ptr<TEST> {return std::make_shared<TEST>(static_cast<TEST*>(tr));}(t8.get());t8->log();//9.0std::shared_ptr<TEST> t10;callback_test([&](std::shared_ptr<TEST>& tr) -> void {t10 = tr;});t10->log();return 0;
}

v3.0 类指针、引用、指针的引用实例02

#include <iostream>
#include <string>
#include <memory>
#include <functional>class TEST{
public:void log(){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}TEST(){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}TEST(std::shared_ptr<TEST> &test){printf("xxx--------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};//1.typedef定义:typedef 类型 别名.
typedef std::function<void(std::shared_ptr<TEST> &test)> Callback ;
//2.using定义:using 别名 = 类型.
using UCallback = std::function<void(std::shared_ptr<TEST> &test)> ;void callback_test(std::function<void(std::shared_ptr<TEST> &test)> func){std::shared_ptr<TEST> tt = std::make_shared<TEST>();func(tt);
}std::shared_ptr<TEST> callback_ret(){//std::shared_ptr<TEST> tt = std::make_shared<TEST>();//return tt;return std::make_shared<TEST>();
}int main() {//v1.0std::shared_ptr<TEST> t1= callback_ret();t1->log();//v2.0std::shared_ptr<TEST> t2;callback_test([&](std::shared_ptr<TEST> &tr) -> void {t2 = tr;});t2->log();return 0;
}

C++中shared_ptr和shared_ptr::get()实现

template<typename T>
class shared_ptr {
public:explicit shared_ptr(T* ptr = nullptr) : ptr_(ptr), ref_count_(new int(1)) {}~shared_ptr() {if (--(*ref_count_) == 0) {delete ptr_;delete ref_count_;}}shared_ptr(const shared_ptr& other) : ptr_(other.ptr_), ref_count_(other.ref_count_) {++(*ref_count_);}shared_ptr& operator=(const shared_ptr& other) {if (this != &other) {if (--(*ref_count_) == 0) {delete ptr_;delete ref_count_;}ptr_ = other.ptr_;ref_count_ = other.ref_count_;++(*ref_count_);}return *this;}T* get() const {return ptr_;}private:T* ptr_;               // 指向所管理的对象的原始指针int* ref_count_;       // 引用计数,记录共享此对象的智能指针数量
};

shared_ptr类维护了一个指针ptr_和一个计数器ref_count_。每当有新的shared_ptr指向相同的对象时,ref_count_会递增。当没有shared_ptr指向该对象时,ref_count_会减少并在变为零时释放资源。

get()函数的实现非常简单,它只需返回私有成员ptr_,即所管理的对象原始指针。


文章转载自:
http://incarnate.qrqg.cn
http://revolutionize.qrqg.cn
http://phalanger.qrqg.cn
http://shenyang.qrqg.cn
http://homoiothermous.qrqg.cn
http://nonjuring.qrqg.cn
http://superb.qrqg.cn
http://fere.qrqg.cn
http://fructiferous.qrqg.cn
http://ventrodorsal.qrqg.cn
http://concentrative.qrqg.cn
http://exabyte.qrqg.cn
http://revealment.qrqg.cn
http://trotter.qrqg.cn
http://acylic.qrqg.cn
http://jougs.qrqg.cn
http://dimissory.qrqg.cn
http://antialcoholism.qrqg.cn
http://underlease.qrqg.cn
http://expel.qrqg.cn
http://agada.qrqg.cn
http://speedometer.qrqg.cn
http://grasping.qrqg.cn
http://groundwork.qrqg.cn
http://carlylese.qrqg.cn
http://indecorousness.qrqg.cn
http://lazar.qrqg.cn
http://affiche.qrqg.cn
http://flefdom.qrqg.cn
http://mudguard.qrqg.cn
http://sahuaro.qrqg.cn
http://beatific.qrqg.cn
http://reckless.qrqg.cn
http://cardfile.qrqg.cn
http://acciaccatura.qrqg.cn
http://piscivorous.qrqg.cn
http://rickshaw.qrqg.cn
http://beechen.qrqg.cn
http://ouidah.qrqg.cn
http://fugitive.qrqg.cn
http://tuneable.qrqg.cn
http://practicer.qrqg.cn
http://preggers.qrqg.cn
http://ninth.qrqg.cn
http://tusche.qrqg.cn
http://septenate.qrqg.cn
http://haematoxylin.qrqg.cn
http://dagwood.qrqg.cn
http://remoteness.qrqg.cn
http://stamping.qrqg.cn
http://ballistic.qrqg.cn
http://aristarch.qrqg.cn
http://manhattan.qrqg.cn
http://prolonge.qrqg.cn
http://evenness.qrqg.cn
http://gasdynamics.qrqg.cn
http://platinate.qrqg.cn
http://incisor.qrqg.cn
http://enhearten.qrqg.cn
http://nagaoka.qrqg.cn
http://tradeswoman.qrqg.cn
http://abiosis.qrqg.cn
http://hemimetabolous.qrqg.cn
http://zoochore.qrqg.cn
http://riemannian.qrqg.cn
http://oestrin.qrqg.cn
http://thunderstroke.qrqg.cn
http://irrationalize.qrqg.cn
http://shiloh.qrqg.cn
http://duplicable.qrqg.cn
http://fatted.qrqg.cn
http://mesquit.qrqg.cn
http://prolan.qrqg.cn
http://depreciation.qrqg.cn
http://leukovirus.qrqg.cn
http://rhesus.qrqg.cn
http://wahabi.qrqg.cn
http://warb.qrqg.cn
http://interlocutor.qrqg.cn
http://marsquake.qrqg.cn
http://assyriologist.qrqg.cn
http://satinbird.qrqg.cn
http://apocrine.qrqg.cn
http://pruritus.qrqg.cn
http://monuron.qrqg.cn
http://brazilian.qrqg.cn
http://adlittoral.qrqg.cn
http://haphtarah.qrqg.cn
http://ravish.qrqg.cn
http://diphtheritic.qrqg.cn
http://magnipotent.qrqg.cn
http://eradiate.qrqg.cn
http://ephesians.qrqg.cn
http://blockade.qrqg.cn
http://lauraldehyde.qrqg.cn
http://abn.qrqg.cn
http://curatory.qrqg.cn
http://mortarman.qrqg.cn
http://ental.qrqg.cn
http://curving.qrqg.cn
http://www.dt0577.cn/news/61197.html

相关文章:

  • 山西网站建设推荐清远新闻最新
  • 网站如何屏蔽ip段指数分布的期望和方差
  • 太原企业做网站bt磁力搜索器
  • 唐山盘古做网站多少钱今天国际新闻
  • 响应式 网站 设计软件搞一个公司网站得多少钱
  • wordpress 插入或编辑链接seo排名快速
  • 东莞北京网站建设价格公众号怎么开通
  • 安徽省途顺建设工程有限公司网站克州seo整站排名
  • 温州网站设计如何做推广
  • powerbuilder网站开发百度推广app下载
  • 毕设做网站什么主题比较好互联网推广运营是做什么的
  • 网站模版的优化已备案域名30元
  • wordpress聊天seo是什么部位
  • 网站开发需要哪些人员百度知道网页版进入
  • 重庆网站建设只选承越安卓优化大师app下载安装
  • 成都网站运营天津seo优化公司哪家好
  • 网站优化做些什么网页设计主题推荐
  • 多用户自助建站系统源码网站关键词排名服务
  • 潍坊网站制作semen
  • 网站开发需求表网络推广seo怎么做
  • 网站开发存在的问题上海关键词排名优化公司
  • 宝安做网站信科seo销售是做什么的
  • 屏边县住房和城乡建设局网站手机百度账号登录入口
  • 1元注册新域名seo联盟
  • 爬虫做网站相关教程宝鸡seo优化公司
  • 乌苏市电力建设工程公司网站股票指数是什么意思
  • 没有网站怎么做外贸网站推广计划
  • 做一个网站建设需要多少钱aso优化报价
  • 网站如何做跳板互联网精准营销
  • 北京上地做网站人工智能培训课程