C++11可变参数模板

文章目录

1.可变参数模板的介绍

1.1C语言中的可变参数

1.2C++98/C++11的类模板和函数模板

  1. C++98/03,类模版和函数模版中只能含固定数量的模版参数
  2. C++11的可变参数模板能够让您创建可以接受可变参数的函数模板和类模板

1.3可变参数的函数模板

cpp 复制代码
void ShowList(Args... args)
{
	//sizeof可以计算参数包中有几个参数
	cout << sizeof...(args) << endl;

	/*不支持
	for (size_t i = 0; i < sizeof...(args); ++i)
	{
		cout << args[i] << " ";
	}
	*/
	cout << endl;
}

int main()
{
	string str("I am A!");
	ShowList();
	ShowList(65);
	ShowList(65, 'A');
	ShowList(65, 'A', str);

	return 0;
}

1.4展开参数包

我们无法直接获取参数包args中的每个参数,只能通过展开参数包 的方式来获取参数包中的每个参数

递归展开

cpp 复制代码
//当参数包个数为0时 最后一次函数调用需要有无参函数
void ShowList()
{
	cout << endl;
}
//参数包含参数个数 >= 0 
template <class T, class ...Args>
void ShowList(const T& single, Args... args)
{
	cout << "ShowList(" << single << ", " << "参数包 含" << sizeof...(args) << "个参数)" << endl;
	ShowList(args...);
}

int main()
{
	string s("3");
	ShowList(1, '2', s); 
	ShowList(1, '2', s, 4, '5', 6);

	return 0;
}

初始化列表展开

cpp 复制代码
template<class T>
int Display(const T& single)
{
	cout << single << " ";
	return 0;
}
template <class ...Args>
void ShowList(Args... args)
{
	int a[] = { Display(args)... };
	//int a[] = { Display(arg1), Display(arg2), Display(arg3)...};
	cout << "当前参数包共" << sizeof(a) / sizeof(a[0]) << "个参数" << endl;
}

int main()
{
	string s("3");
	ShowList(1, '2', s); 
	ShowList(1, '2', s, 4, '5', 6);

	return 0;
}

2.可变参数模板的应用

cpp 复制代码
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year = 1, int month = 1, int day = 1)" << endl;
	}

	Date(const Date& d)
		:_year(d._year)
		, _month(d._month)
		, _day(d._day)
	{
		cout << "Date(const Date& d)" << endl;
	}

	Date& operator=(const Date& d)
	{
		cout << "Date& operator=(const Date& d))" << endl;
		return *this;
	}

private:
	int _year;
	int _month;
	int _day;
};

// template <class... Args>
// iterator emplace(const_iterator pos, Args&&... args);

// template <class... Args>  
// void emplace_back(Args&&... args);

int main()
{
	/// emplace的优势1 
	//没有区别
	vector<int> v1;
	v1.push_back(1);
	v1.emplace_back(2);

	//emplace_back的优势 此情况更高效
	vector<pair<string, int>> v2;
	v2.push_back(make_pair("A", 65));
    v2.emplace_back(make_pair("A", 65));

	v2.emplace_back("A", 65);

	/// emplace的优势2 
	cout << "-------------- push_back --------------" << endl << endl;
	list<Date> lt1;
	lt1.push_back(Date(2022, 11, 16));
	cout << endl;
	cout << "------------- emplace_back -----------" << endl << endl;
	lt1.emplace_back(2022, 11, 16);

	return 0;
}
相关推荐
Ivanqhz8 分钟前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_7345717612 分钟前
深入理解C++ RAII
开发语言·c++
泡海椒15 分钟前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
aramae23 分钟前
模拟实现memset()(C语言)
c语言·开发语言·后端
hetao173383734 分钟前
2026-09-18 hetao1733837 的刷题记录
c++·算法
wuyk5551 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
stolentime1 小时前
CSP-J2026第一轮试题(附答案解析、markdown源码)
c++·csp
船厂电气自动化ai大模型1 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
Rabitebla1 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
lv__pf2 小时前
seata【实战 msb】
java·开发语言·后端