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

网站建设 提成人工智能网页设计

网站建设 提成,人工智能网页设计,用js做的网站代码吗,建筑信息网C11可变模板参数一、简介二、语法三、可变模版参数函数3.1、递归函数方式展开参数包3.2、逗号表达式展开参数包一、简介 C11的新特性–可变模版参数#xff08;variadic templates#xff09;是C11新增的最强大的特性之一#xff0c;它对参数进行了高度泛化#xff0c;它能… C11可变模板参数一、简介二、语法三、可变模版参数函数3.1、递归函数方式展开参数包3.2、逗号表达式展开参数包一、简介 C11的新特性–可变模版参数variadic templates是C11新增的最强大的特性之一它对参数进行了高度泛化它能表示0到任意个数、任意类型的参数。 二、语法 可变参数模板语法 template class... T void f(T... args);上面的可变模版参数的定义当中省略号的作用有两个 声明一个参数包T… args这个参数包中可以包含0到任意个模板参数在模板定义的右边可以将参数包展开成一个一个独立的参数。 上面的参数args前面有省略号所以它就是一个可变模版参数我们把带省略号的参数称为“参数包”它里面包含了0到NN0个模版参数。我们无法直接获取参数包args中的每个参数的只能通过展开参数包的方式来获取参数包中的每个参数这是使用可变模版参数的一个主要特点也是最大的难点即如何展开可变模版参数。 可变模版参数和普通的模版参数语义是一致的所以可以应用于函数和类即可变模版参数函数和可变 模版参数类然而模版函数不支持偏特化所以可变模版参数函数和可变模版参数类展开可变模版参数的方法还不尽相同下面我们来分别看看他们展开可变模版参数的方法。 三、可变模版参数函数 #include iostreamusing namespace std;template class... Tvoid func(T... args) {coutsizeof...(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。这个例子只是简单的将可变模版参数的个数打印出来如果我们需要将参数包中的每个参数打印出来的话就需要通过一些方法了。 展开可变模版参数函数的方法一般有两种 通过递归函数来展开参数包。是通过逗号表达式来展开参数包。 3.1、递归函数方式展开参数包 通过递归函数展开参数包需要提供一个参数包展开的函数和一个递归终止函数递归终止函数正是用来终止递归的。 #include iostream using namespace std;//递归终止函数 void print() {coutemptyendl; } //展开函数 template class T,class... args void print(T head,args... reset) {coutparameter:headendl;print(reset...); }int main() {print(1,2,3,4,5.5,daklj);return 0; }上例会输出每一个参数直到为空时输出empty。展开参数包的函数有两个一个是递归函数另外一 个是递归终止函数参数包Args…在展开的过程中递归调用自己每调用一次参数包中的参数就会少一 个直到所有的参数都展开为止当没有参数时则调用非模板函数print终止递归过程。 上面的递归终止函数还可以写成这样 template class T void print(T t) {couttend; }3.2、逗号表达式展开参数包 递归函数展开参数包是一种标准做法也比较好理解但也有一个缺点,就是必须要一个重载的递归终止 函数即必须要有一个同名的终止函数来终止递归这样可能会感觉稍有不便。有没有一种更简单的方 式呢其实还有一种方法可以不通过递归方式来展开参数包这种方式需要借助逗号表达式和初始化列 表。比如前面print的例子可以改成这样 #include iostream using namespace std;templateclass Tvoid printarg(T t) {couttendl; } 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。同时还用到了C11的另外一个特性——初始化列表通过初始化列表来初始化一个变长数组, {(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... Argsvoid expand(const F f,Args...args) {initializer_listint{(f(forwardArgs(args)),0)...}; } int main() {expand([](int i){coutiendl;},1,2,3);return 0; }
http://www.hkea.cn/news/14471099/

相关文章:

  • 德令哈市公司网站建设坡头网站建设公司
  • 平台推广网站排名qq邮箱登录
  • 用电脑做服务器搭建php网站做网站投资太大 网站也没搞起来
  • 手机网站图片切换jquery网站开发 数据库对比
  • 有关网站建设的书中山顺德网站建设
  • 手机能建网站不秦皇岛昌黎县建设局网站
  • 北京 高端网站定制微信公众号推广创意语
  • php网站建设价格深圳html5网站推广价格
  • 请人做网站花多少钱建网站的软件有哪些
  • 做网站不给源码wordpress博客漏洞
  • 程序做网站好还是app好牙医工具网站建设课程设计报告
  • 增城定制型网站建设如此查询网站名字是否注册
  • 泰安市建设职工培训中心网站进不去互联网企业解决方案
  • 北京网站推广哈尔滨如何快速建站
  • 特色网站建设电子商务网站建设实习报告
  • 家具营销型网站模板做外汇交易的浏览什么网站
  • 网站规划是什么意思哔哩哔哩在线看免费观看视频
  • 昆明做网站推国外h5制作网站
  • 云南做网站需要多少钱软件定制是什么意思
  • 网站管理后台登录地址雄安专业网站建设哪家好
  • ps个人网站制作流程南京网站制作开发
  • 官方新闻平台有哪些宝应百度seo
  • 怎样建设一个内部网站泰州seo网络推广
  • 网站开发需要用例图吗南通seo
  • 南阳网站优化渠道哪个网站做外链视频好
  • 手把手教建设网站网站建设网易
  • 360提示的危险网站品牌策划书模板
  • 做网站外国的服务器浏阳市住房和城乡建设局的网站
  • 滁州网站建设价格教育网站开发用例图
  • 西安seo王网站建设关键词优化价格