C++11变参模板

在C++11中出现的变参模板,可以让我们不需关心函数调用的参数多少,类似实现C中的printf函数那样。

变参依赖于C++强大的模板

可以这样声明

template<class T1,class... Args>   //   Args就是一种类型参数包,在定义的函数中需要递归去解析

void MutiArg(const T1&t1,Args... args)

{

//  do something with t1对第一个调用参数进行操作

MutiArg(args...);  //对参数包进行递归解析,这个函数会一直调用直到其参数个数为1时停止调用
}

当参数个数被解析到只有一个时调用下边的函数

template<class T1>

void MutiArg(const T1&t1)

{

//do something with t1
}

下面直接上测试的完整例子

#incldue<iostream>

#include<string>

template<class T1, class... Args>   
void MutiArg(const T1&t1, Args... args)
{
std::cout << t1 << std::endl;
MutiArg(args...);
}

template<class T>
void MutiArg(const T& t)
{
std::cout << "t=" << t << std::endl;
std::cout << "end" << std::endl;
}

void main()

{

MutiArg(1,1.2,3,"string",‘c‘);
}

其运行结果为

1

1.2

3

string

c

--------------end

时间: 2024-10-10 10:52:53

C++11变参模板的相关文章

编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异

编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异 题目挺绕口的.C++ 11的好东西不算太多,但变参模板(Variadic Template)肯定是其中耀眼的一颗明星,在C++设计新思维中,你可以看到很多模版的代码为了支持不确定的参数个数,而要重载1个参数到N个模板参数的N个函数.虽然种代码一般也是用会用宏和脚步辅助生成.但我想也没有人愿意看到几千行这种单调的函数.通过这个东东,模板的威力可以爆发. 目前的最新的编译器基本都已经支持Variadic Tem

每日一题20:与C++11的第一次邂逅——可变参模板与C#委托模拟

这篇文章本来是前天发的,但是不知道为什么CSDN上没有显示,可能是我没发,记错了.又由于没有留底稿,还是重写一下吧,也为知己不留底稿的恶习做个标记. 之所以接触C++11是因为自己前天突发奇想想用C++来模拟一下C#里的委托,但是尝试过很多方法和各种搜索后,知道之前的C++是不支持模板重载的,所以不可能通过编写多种版本的模板来实现变参的效果,如果使用<C++设计新思维>里的TypeList方式的话,我不知道能不能做到,即使能做到也不可能达到预期的效果,并且TypeList是一个重型武器,构建起

C++11的模板新特性-变长参数的模板

这个特性很赞,直接给例子吧,假如我要设计一个类,CachedFetcher内部可能使用std::map也可能使用std::unordered_map,也可能是其它的map,怎么设计呢?没有C++11变长模板之前这很费劲.. 因为map的模板参数可不是只有key,value两个啊,还有一些有默认参数的template参数... ? ? template<typename _Key, typename _Value, template<class _Kty, class _Ty, typename

c++11:模板

c++11中Universal Reference类型的模板参数的推导规则? universal refences 简单来说就是type&& + syntax + type deduction,即可以引用左值,也可以引用右值. template<typename T> void f(P); f(A); Effective Modern C++ 条款1 理解模板类型推断 C++11之经典书籍和网文推荐 原文地址:https://www.cnblogs.com/losophy/p/

C++11 函数模板的默认模板参数

类模板:通用的类描述(使用泛型来定义类),进行实例化时,其中的泛型再用具体的类型替换. 函数模板:通用的函数描述(使用泛型来定义函数),进行实例化时,其中的泛型再用具体的类型替换. [1]C++98标准中两者的区别 函数模板和类模板在C++98标准中一起被引入,两者区别主要在于: 在类模板声明时,标准允许其有默认模板参数.而函数模板却不支持. 默认模板参数的作用如同函数的默认形参.不过在C++11中,这一限制已经被解除了,如下例所示: 1 void DefParm(int m = 3) {} /

C++11 外部模板

[1]引入外部模板为了解决什么问题? “外部模板”是C++11中一个关于模板性能上的改进.实际上,“外部”(extern)这个概念早在C的时候已经就有了. 常见的情况,在一个文件a.c中定义了一个变量int i,而在另外一个文件b.c中想使用它,这个时候就会在没有定义变量i的b.c文件中做一个外部变量的声明.比如: // 声明在b.c文件中 extern int i; 这样做的好处是,在分别编译了a.c和b.c之后,其生成的目标文件a.o和b.o中只有i这个符号(可简单理解为变量)的一份定义.

C++11实现模板手柄:委托构造函数、defaultkeyword分析

C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码级,查,出现例如以下错误可忽略. warning C4290: 忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow) 下为:VS2012不支持托付构造函数.建议使用cocos2d-x 3.2及版本号的朋友更新VS至2013版. 1>d:\cpp_lab\testqueue_

C++11 : 外部模板(Extern Template)

在C++98/03语言标准中,对于源代码中出现的每一处模板实例化,编译器都需要去做实例化的工作:而在链接时,链接器还需要移除重复的实例化代码.显然,让编译器每次都去进行重复的实例化工作显然是不必要的,并且连接器也因此受累.在现实编码世界里,一个软件的实现可能会在很多代码块中使用同一种类型去实例化同一个模板.此时,如果能够让编译器避免此类重复的实例化工作,那么可以大大提供编译器的工作效率.因此,人们迫切需要一种手段(一种声明方式)来告诉编译器“该处出现的模板实例化工作已在其它编译单元中完成,不再需

C++11(15): 模板与泛型编程

面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况.不同之处:OOP能处理类型在程序运行之前都未知的情况:而泛型编程中,在编译时就能获知类型了 模板参数类别不能为空. 模板参数表示在类或函数定义中用到的类型或值. template <typename T> int compare(const T &v1 , const T &v2) { if(v1<v2) return -1; if(v2<v1) return 1; return 0 ; } cout<