C++模板介绍:什么是变长模板函数

最近的C++语言标准有些更进一步的复杂特性,诸如加上了变长模板。我在尝试理解这个特性的过程中

的一个最大的问题是,没有足够简单的代码示例来说明到底变长模板是如何使用和起作用的。

以下是 我的一个基本样例来说明变长模板:

template <class ...A> int func(A... arg)

{

   return sizeof...(arg);

}

int main(void)

{

   return func (1,2,3,4,5,6);

}

首要介绍的是一些术语: 一个模板参数现在可以是一个模板参数包, <class...A>。一个模板参数包可以代表任意数量的

模板参数。在以上这个样例中,模板 <class...A>定义了func这个函数,他拥有任意数量的函数参数。函数参数(A... arg)即为

一个函数 参数包,他以一个参数的"形式"代表了模板template <class...A>参数包的每个成员。在这 个示例中,我们使用了6个参数来调用函数func。

模板参数推导(template argument deduction)会将参数 包<class...A>推导成为

<int,int,int,int,int,int>,接着函数参数包变成 (int,int,int,int,int,int),正好对应了6个传递过来的整形参数。

变长操作符sizeof...简单的返回了参 数包的参数个数(函数或者模板的),结果为6.

当然任何参数包多可以为空,考虑以下代码示 例:

template <class ...A> int func(A... arg)

{

   return sizeof... (arg);

}

int main(void)

{

   return func();

}

时间: 2024-12-03 04:02:22

C++模板介绍:什么是变长模板函数的相关文章

C++中的变长参数深入理解_C 语言

前言 在吸进的一个项目中为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的类都有默认构造函数,以及复制构造函数等.但使用共享内存和内存池的类可能没有默认构造函数,而是定义了多个参数的构造函数,于是如何将参数传入MemNew函数便成了问题. 一.变长参数函数 首先回顾一下较多使用的变长参数函数,最经典的便是printf. extern int printf(cons

J2SE5.0 实例---变长参数

j2se 变长参数(Varargs)与泛型一样,变长参数是C++中有而Java中没有的一种语言特性,在过去如果我们想向一个函数传递可变数量的函数,就必须首先将这些参数放入一个数组中,然后将数组传递给函数.就如同下面所作的一样: Object[] arguments = { 640, "kb", "anybody", "Bill Gates" }; String result = MessageFormat.format(      "{

ASP.NET预定义模板介绍_实用技巧

一. 实例演示:通过模板将布尔值显示为RadioButton 在默认的情况下,不论是对于编辑模式还是显示模式,一个布尔类型的属性值总是以一个CheckBox的形式呈现出来.我们创建如下一个表示员工的类型Employee,它具有一个布尔类型的属性IsPartTime表示该员工是否为兼职. public class Employee { [DisplayName("姓名")] public string Name { get; set; } [DisplayName("部门&qu

Groovy模板引擎上(基础模板介绍)

原文链接 作者:groovy团队  译者:树下偷懒的蚁 1.简介 Groovy支持多种方式动态的生成文本譬如:GStrings, printf(基于Java5),MarkupBuilder .除此之外,模板框架则是非常适用基于静态模板生成文本的应用程序. 2.模板框架 在Groovy中,模板框架包含TemplateEngine抽象基类(引擎必须实现),Template接口(引擎生成的模板必须实现). Groovy包含的以下几种模板引擎: SimpleTemplateEngine -基础模板引擎

在Asp.net下实现变长连接的web即时应用的实现范例及ReverseAjax的演示介绍_实用技巧

ReverseAjax 反转AJAX是一种旨在将逻辑控制权转移到服务端的Web实现模式 何谓控制权转移 传统的AJAX调用一般由客户端行为触发,比如说获取区域数据,异步验证等. ReverseAjax将控制权转交给服务端,就像服务端触发客户端事件一样,即很早的Web推的技术. ASP.NET实现变长连接需要使用到异步页面的技术,同时该页面需要禁用会话来实现每次请求都产生一个新的实例执行. 复制代码 代码如下: <%@ Page Language="C#" AutoEventWir

浅谈C++内存分配及变长数组的动态分配_C 语言

第一部分 C++内存分配 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存 储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员

Spark UDF变长参数的二三事儿

在复杂业务逻辑中,我们经常会用到Spark的UDF,当一个UDF需要传入多列的内容并进行处理时,UDF的传参该怎么做呢? 下面通过变长参数引出,逐一介绍三种可行方法以及一些不可行的尝试... 引子 变长参数对于我们来说并不陌生,在Java里我们这么写 public void varArgs(String... args)  在Scala里我们这么写 def varArgs(cols: String*): String  而在Spark里,很多时候我们有自己的业务逻辑,现成的functions满足

C++之:模板元编程(二) 模板形参

一.模板形参概述 有三种类型的模板形参:类型形参,非类型形参和模板形参. 二.类型形参 2.1 .类型模板形参 类型形参由关见字class或typename后接说明符构成,如template<class T> void h(T a){};其中T就是一个类型形参,类型形参的名字由用户自已确定.模板形参表示的是一个未知的类型.模板类型形参可作为类型说明符用在模板中的任何地方,与内置类型说明符或类类型说明符的使用方式完全相同,即可以用于指定返回类型,变量声明等. 2.2. 不能为同一个模板类型形参指

JVM源码分析之String.intern()导致的YGC不断变长

概述 之所以想写这篇文章,是因为YGC过程对我们来说太过于黑盒,如果对YGC过程不是很熟悉,这类问题基本很难定位,我们就算开了GC日志,也最多能看到类似下面的日志 [GC (Allocation Failure) [ParNew: 91807K->10240K(92160K), 0.0538384 secs] 91807K->21262K(2086912K), 0.0538680 secs] [Times: user=0.16 sys=0.06, real=0.06 secs] 只知道耗了多长