IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11可变参数模板 -> 正文阅读

[C++知识库]C++11可变参数模板

简介

  • C++11增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。
  • 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。
  • 参数包可以容纳0到N个模板参数,这几个参数类型可以为任意类型(可扩展参数)。f()没有传入参数,所以参数包为空,输出的size为0,后面两次调用分别传人两个和三个参数,故输出的size分别为2和3。

参数表

省略号的作用有两个:

  1. 省略号在模板参数左边,声明一个参数包,这个参数包可以包含0到任意个模板参数
  2. 省略号在参数的右边,可以将参数包展开成一个个独立的参数

可变参数函数模板

解析参数包

  • 如果需要用参数包中的参数,则一定要将参数包展开
    有两种展开参数包的方法:
  1. 一种方法是通过递归的模板函数来将参数包展开
  2. 另外一种是通过逗号表达式和初始化列表方式展开参数包。
递归的模板函数方式展开参数包
  • 提供一个参数包展开的函数和一个递归终止的函数,
#include<iostream>
template <typename T>
void Print(T t)
{
	std::cout << t << std::endl;
}

template <typename T1, typename T2>
void Print(T1 t1, T2 t2)
{
	std::cout << t1 << t2 << std::endl;
}

template <typename T1, typename T2, typename T3>
void Print(T1 t1, T2 t2, T3 t3)
{
	std::cout << t1 << t2 << t3 << std::endl;
}

//template <typename T1, typename T2, typename T3, typename T4>
//void Print(T1 t1, T2 t2, T3 t3, T4 t4)
//{
//	std::cout << t1 << t2 << t3 << t4 << std::endl;
//}

//template <typename T1, typename T2, typename T3, typename T4, typename T5>
//void Print(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)
//{
//	std::cout << t1 << t2 << t3 << t4 << t5 << std::endl;
//}


//以上都为递归终止函数的选项

//展开函数
template<class T,class ...Args>
void Print(T head, Args... rest)
{
	std::cout << "parameter" << head << std::endl;
	Print(rest...);
}

int main(void)
{
	//Print(1);
	//Print(1, 2);
	//Print(1, 2, 3);
	//Print(1, 2, 3, 4);
	Print(1, 2, 3, 4, 5);


	system("pause");
	return 0;
}

递归解析参数包结合tuple
#include<iostream>
#include<tuple>
using namespace std;

template<typename std::size_t I = 0, typename Tuple >
typename std::enable_if < I == std::tuple_size<Tuple>::value>::type printtp(Tuple t){}

//元组本身也是一个可变类模板,tuple_size 为tuple提供对元组中元素数量的访问,作为编译时常量表达式。
template<typename std::size_t I=0,typename Tuple >
typename std::enable_if<I < std::tuple_size<Tuple>::value>::type printtp(Tuple t)
{
	cout << get<I>(t)<<endl;
	printtp<I + 1>(t);
}

template<typename ...Arg>
void print(Arg... arg)
{
	printtp(std::make_tuple(arg...));
}

int main()
{
	print(1, 2, "sqh", 4.5, true);

	return 0;
}
初始化列表方式展开参数包

可变参数模板类

  • 可变参数模板类是一个带可变模板参数的模板类
  • 这个可变参数模板类可以携带任意类型任意个数的模板参数

std:.tuple就是一个可变模板类,它的定义如下:

template< class... Types >
class tuple;

//使用

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:28:07  更:2021-10-16 19:29:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:30:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码