C++:完美转发和可变参数模板

完美转发和可变参数模板

(1)完美转发

A.What(什么是完美转发)

某些函数将其一个或多个实参连同其类型不变地转发给其它函数,我们需要保证被转发实参的所有性质,这种保证转发实参所有性质的参数传递 ,我们称之为"完美转发"

B.How(如何进行完美转发)

常见的模板函数定义形式如下:一般使用两个引用符来实现完美转发

cpp 复制代码
template <typename F, typename T1, typename T2>
auto flip(F f, T1 &&t1, T2 &&t2)
{
	return f(t1, t2);
}

假如存在函数func()如下:

cpp 复制代码
int func(int& iVal01, int iVal02)
{
	return iVal01 + iVal02;
}
int main()
{
	int iVal = 10;
	auto res = flip(func, iVal, 30); //res为40
	return 1;
}

在上述例子中,T1为int& &&,折叠为int& t1,从而实现了完美转发

C. forward()和move()函数介绍

forward() 可以保持给定实参的左值/右值属性

cpp 复制代码
forward<T>(t); //使用方式,保持t的左值或右值属性

move函数将左值转换为右值

cpp 复制代码
std::string str = "Hello, ThreeBody!";
std::string &&ref = std::move(str); //将左值强转为右值

(2)可变参数模板

A.What(什么是可变参数模板)

模板参数的长度可变,以递归的形式来访问传入的参数

cpp 复制代码
void show() // 终止条件 
{ 
	cout << endl; 
}
template <typename T, typename... Args> // Args 为模板参数包,表示 0 个或多个模板参数 
void show(const T &t, const Args &...args) // args 为函数参数包,表示 0 个或多个函数参数
{
	cout << t << " " << endl; 
	cout << sizeof...(Args) << endl; // 2 1 0 ;sizeof...运算符,返回包中参数的个数 cout << sizeof...(args) << endl; // 2 1 0
	show(args...); 
}
string zs = "张三"; 
double defict = 128.1; 
int year = 1981;
show(zs, defict, year);

B.包拓展

包拓展就是将可变参数模板分解成构成元素

C.转发参数包

实现可变参数的"完美转发"

cpp 复制代码
void show() // 终止条件
{
	cout << endl; 
}
template <typename T, typename... Args> // Args 为模板参数包,表示 0 个或多个模板参数 
void show(T &&t, Args &&...args) // args 为函数参数包,表示 0 个或多个函数参数
{
	cout << t << " " << endl; 
	cout << sizeof...(Args) << endl; 
	cout << sizeof...(args) << endl; 
	show(std::forward<Args>(args)...);
}
相关推荐
从零开始的代码生活_5 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
xywww1685 小时前
AWS 账号权限怎么分:根用户和 IAM 用户区别及日常使用建议
大数据·开发语言·人工智能·python·gpt·云计算·aws
炸薯条!6 小时前
从零开始学C++ (内存管理)
java·jvm·c++
cpp_25018 小时前
P6625 [省选联考 2020 B 卷] 卡牌游戏
数据结构·c++·算法·前缀和·贪心·洛谷题解·省选
没钥匙的锁18 小时前
16-Java反射机制:Spring IOC背后的核心技术
java·开发语言·spring
起予者汝也8 小时前
Python 数据结构
开发语言·数据结构·python
ECT-OS-JiuHuaShan10 小时前
严格证明:还原论是ASCII,整体论是UTF-8的历史意义和价值
开发语言·人工智能·算法·量子计算
AC赳赳老秦10 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
祉猷并茂,雯华若锦10 小时前
Appium 3.x 实战:元素定位与常见错误解析
开发语言·python·appium
Lethehong10 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言