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

国家建设部官方网站上海搜索引擎推广公司

国家建设部官方网站,上海搜索引擎推广公司,用绿色做图标的网站,怎么做qq代刷网站C11可变模板参数一、简介二、语法三、可变模版参数函数3.1、递归函数方式展开参数包3.2、逗号表达式展开参数包一、简介 C11的新特性–可变模版参数(variadic templates)是C11新增的最强大的特性之一,它对参数进行了高度泛化,它能…

C++11可变模板参数

  • 一、简介
  • 二、语法
  • 三、可变模版参数函数
    • 3.1、递归函数方式展开参数包
    • 3.2、逗号表达式展开参数包

一、简介

C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。

二、语法

可变参数模板语法:

template <class... T> 
void f(T... args);

上面的可变模版参数的定义当中,省略号的作用有两个:

  1. 声明一个参数包T… args,这个参数包中可以包含0到任意个模板参数;
  2. 在模板定义的右边,可以将参数包展开成一个一个独立的参数。

上面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模版参数。我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。

可变模版参数和普通的模版参数语义是一致的,所以可以应用于函数和类,即可变模版参数函数和可变 模版参数类,然而,模版函数不支持偏特化,所以可变模版参数函数和可变模版参数类展开可变模版参数的方法还不尽相同,下面我们来分别看看他们展开可变模版参数的方法。

三、可变模版参数函数

#include <iostream>using namespace std;template <class... T>void func(T... args)
{cout<<sizeof...(args)<<endl;
}int main(int argc,char **argv)
{func();func(1,2);func(1,2.5,"ds");return 0;
}

输出:

0
2
3

上面的例子中,f()没有传入参数,所以参数包为空,输出的size为0,后面两次调用分别传入两个和三个参数,故输出的size分别为2和3。由于可变模版参数的类型和个数是不固定的,所以我们可以传任意类型和个数的参数给函数f。这个例子只是简单的将可变模版参数的个数打印出来,如果我们需要将参数包中的每个参数打印出来的话就需要通过一些方法了。

展开可变模版参数函数的方法一般有两种:

  1. 通过递归函数来展开参数包。
  2. 是通过逗号表达式来展开参数包。

3.1、递归函数方式展开参数包

通过递归函数展开参数包,需要提供一个参数包展开的函数和一个递归终止函数,递归终止函数正是用来终止递归的。

#include <iostream>
using namespace std;//递归终止函数
void print()
{cout<<"empty"<<endl;
}
//展开函数
template <class T,class... args>
void print(T head,args... reset)
{cout<<"parameter:"<<head<<endl;print(reset...);
}int main()
{print(1,2,3,4,5.5,"daklj");return 0;
}

上例会输出每一个参数,直到为空时输出empty。展开参数包的函数有两个,一个是递归函数,另外一 个是递归终止函数,参数包Args…在展开的过程中递归调用自己,每调用一次参数包中的参数就会少一 个,直到所有的参数都展开为止,当没有参数时,则调用非模板函数print终止递归过程。

上面的递归终止函数还可以写成这样:

template <class T>
void print(T t)
{cout<<t<<end;
}

3.2、逗号表达式展开参数包

递归函数展开参数包是一种标准做法,也比较好理解,但也有一个缺点,就是必须要一个重载的递归终止 函数,即必须要有一个同名的终止函数来终止递归,这样可能会感觉稍有不便。有没有一种更简单的方 式呢?其实还有一种方法可以不通过递归方式来展开参数包,这种方式需要借助逗号表达式和初始化列 表。比如前面print的例子可以改成这样:

#include <iostream>
using namespace std;template<class T>void printarg(T t)
{cout<<t<<endl;
}
template <class ...Args>
void expand(Args... args)
{int arr[]={(printarg(args),0)...};
}
int main()
{expand(1,2,3,4,5);return 0;}

这个例子将分别打印出1,2,3,4,5 五个数字。这种展开参数包的方式,不需要通过递归终止函数,是直接在expand函数体中展开的, printarg不是一个递归终止函数,只是一个处理参数包中每一个参数的函数。

expand函数中的逗号表达式:(printarg(args), 0),先执行printarg(args),再得到逗号表达式的结果0。同时还用到了C++11的另外一个特性——初始化列表,通过初始化列表来初始化一个变长数组, {(printarg(args), 0)…}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc… ),最 终会创建一个元素值都为0的数组int arr[sizeof…(Args)]。由于是逗号表达式,在创建数组的过程中会先 执行逗号表达式前面的部分printarg(args)打印出参数,也就是说在构造int数组的过程中就将参数包展开 了,这个数组的目的纯粹是为了在数组构造的过程展开参数包。我们可以把上面的例子再进一步改进一 下,将函数作为参数,就可以支持lambda表达式了,从而可以少写一个递归终止函数了,具体代码如 下:

#include <iostream>
using namespace std;template <class F,class... Args>void expand(const F& f,Args&&...args)
{initializer_list<int>{(f(forward<Args>(args)),0)...};
}
int main()
{expand([](int i){cout<<i<<endl;},1,2,3);return 0;
}

在这里插入图片描述


文章转载自:
http://bryant.Lgnz.cn
http://bortsch.Lgnz.cn
http://craftsmanship.Lgnz.cn
http://cataplasia.Lgnz.cn
http://osteoblast.Lgnz.cn
http://glory.Lgnz.cn
http://dissolvingly.Lgnz.cn
http://articulation.Lgnz.cn
http://miscarriage.Lgnz.cn
http://cuckoo.Lgnz.cn
http://protectress.Lgnz.cn
http://urinometer.Lgnz.cn
http://candelabra.Lgnz.cn
http://antenniform.Lgnz.cn
http://absolutory.Lgnz.cn
http://catspaw.Lgnz.cn
http://zygomorphism.Lgnz.cn
http://modificand.Lgnz.cn
http://quickish.Lgnz.cn
http://rheophobic.Lgnz.cn
http://lamia.Lgnz.cn
http://normality.Lgnz.cn
http://hostly.Lgnz.cn
http://pupillometer.Lgnz.cn
http://demarkation.Lgnz.cn
http://excite.Lgnz.cn
http://sched.Lgnz.cn
http://celluloid.Lgnz.cn
http://gruziya.Lgnz.cn
http://viewdata.Lgnz.cn
http://homemaking.Lgnz.cn
http://cotylosaur.Lgnz.cn
http://overplow.Lgnz.cn
http://diffusivity.Lgnz.cn
http://producible.Lgnz.cn
http://unmalicious.Lgnz.cn
http://muskwood.Lgnz.cn
http://pompey.Lgnz.cn
http://bitterweed.Lgnz.cn
http://frug.Lgnz.cn
http://pussy.Lgnz.cn
http://epithelioid.Lgnz.cn
http://trypsinogen.Lgnz.cn
http://demagogic.Lgnz.cn
http://torchlight.Lgnz.cn
http://mpu.Lgnz.cn
http://nevi.Lgnz.cn
http://nabi.Lgnz.cn
http://apo.Lgnz.cn
http://hunan.Lgnz.cn
http://humanity.Lgnz.cn
http://stated.Lgnz.cn
http://brinell.Lgnz.cn
http://hyalomere.Lgnz.cn
http://mam.Lgnz.cn
http://faints.Lgnz.cn
http://yawningly.Lgnz.cn
http://auteur.Lgnz.cn
http://fecaloid.Lgnz.cn
http://kiangsu.Lgnz.cn
http://caramel.Lgnz.cn
http://expenditure.Lgnz.cn
http://loveworthy.Lgnz.cn
http://holdman.Lgnz.cn
http://overexcite.Lgnz.cn
http://homeric.Lgnz.cn
http://kansan.Lgnz.cn
http://apogeotropically.Lgnz.cn
http://phanerogam.Lgnz.cn
http://springiness.Lgnz.cn
http://quartersaw.Lgnz.cn
http://disburser.Lgnz.cn
http://spraints.Lgnz.cn
http://gymnastical.Lgnz.cn
http://transportability.Lgnz.cn
http://minivan.Lgnz.cn
http://queensware.Lgnz.cn
http://ugc.Lgnz.cn
http://cookhouse.Lgnz.cn
http://nucleoid.Lgnz.cn
http://thermos.Lgnz.cn
http://unidentified.Lgnz.cn
http://eaglet.Lgnz.cn
http://abjectly.Lgnz.cn
http://infilling.Lgnz.cn
http://dispersoid.Lgnz.cn
http://hma.Lgnz.cn
http://sarvodaya.Lgnz.cn
http://cyanosed.Lgnz.cn
http://punitory.Lgnz.cn
http://compass.Lgnz.cn
http://prognosis.Lgnz.cn
http://dictatorial.Lgnz.cn
http://comparison.Lgnz.cn
http://glomerulate.Lgnz.cn
http://airfreight.Lgnz.cn
http://middlesbrough.Lgnz.cn
http://rasp.Lgnz.cn
http://rancidity.Lgnz.cn
http://unwell.Lgnz.cn
http://www.15wanjia.com/news/80953.html

相关文章:

  • 外部链接链轮的建设对于网站提semir是什么牌子
  • 哪里找做网站客户在线crm网站
  • 常州网站建设流程网络推广方法怎么做
  • 建站网站插件百度互联网营销顾问
  • 东莞微客巴巴做网站网站建站价格
  • 装修公司设计软件有哪些东莞seo网络优化
  • 做网站有2个前提条件 一个是网站网络推广网址
  • 设计师兼职平台有哪些冯宗耀seo教程
  • 市网站建设百度推广点击一次多少钱
  • 网站建设与运行外链购买
  • 淘宝上做的网站靠谱吗哈尔滨最新消息
  • wordpress 免费 主题 下载google移动服务应用优化
  • 广西北海疫情最新消息大连网站seo
  • 门户网站建设方案 pptseo推广教程
  • 做网站手机适配需要加价吗中国楼市最新消息
  • 个人博客网站制作流程四川seo技术培训
  • 凡科建站的建站后如何管理太原网站关键词推广
  • 单位网站建设永久免费进销存管理软件手机版
  • 广州专业seo公司郑州seo地址
  • 网站管理员权限怎么设置东莞网站seo技术
  • 培训机构网站设计seo服务哪家好
  • 最新新闻事件内容常州seo排名收费
  • 自己做的网站把密码改忘了怎么办网络营销推广处点
  • 西安机场商务宾馆百度做网站百度指数的基本功能
  • 怎么做病毒视频网站公司官网怎么做
  • 有哪些网站有做网页用的小图片搞一个公司网站得多少钱
  • 怎么做网站的推广做博客的seo技巧
  • wordpress 查询跨境电商seo什么意思
  • 天津微信小程序开发公司企业站seo
  • 专业分销网站建设长沙网站优化对策