完美转发(模板)--T

news/2024/10/7 11:23:06/文章来源:https://www.cnblogs.com/niumachen/p/18449839

在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢失性能或引入不必要的拷贝。

完美转发的关键在于通过模板的转发引用(Forwarding Reference),结合 std::forward,将参数以最合适的形式传递给目标函数。

为什么需要完美转发?

在某些情况下,我们希望编写一个通用的函数模板,这个函数模板接收一个可调用对象,并将参数传递给这个可调用对象。
为了避免不必要的拷贝(尤其是右值被拷贝的情况),我们需要一种机制来将参数的值类别保持下来,这就是完美转发的目的。

什么是转发引用?

当一个模板参数被定义为 T&& 时,它并不总是表示右值引用。在模板的上下文中,T&& 是一个特殊的类型,称为转发引用(有时也叫万能引用)。它具有这样的行为:

  • 如果传入的是左值T&& 被推导为 T&(左值引用)。
  • 如果传入的是右值T&& 被推导为 T&&(右值引用)。

这使得我们能够编写一个函数模板,既能接受左值参数,又能接受右值参数。

完美转发的核心:std::forward

完美转发的核心技术是通过 std::forward 来实现的。std::forward 是一个标准库函数,它的作用是在模板中根据参数的类型完美地转发参数:

  • 如果参数是左值,std::forward 会保持它为左值。
  • 如果参数是右值,std::forward 会将其转发为右值。

完美转发的使用示例

以下是一个使用完美转发的简单示例:

#include <iostream>
#include <utility>  // for std::forward// 一个通用的函数模板,用于接收任意的可调用对象和参数,并调用它
template <typename F, typename... Args>
void wrapper(F&& f, Args&&... args) {// 使用std::forward来完美转发参数std::forward<F>(f)(std::forward<Args>(args)...);
}// 左值引用和右值引用的两个重载函数
void foo(int& x) {std::cout << "Lvalue reference called: " << x << std::endl;
}void foo(int&& x) {std::cout << "Rvalue reference called: " << x << std::endl;
}int main() {int a = 10;// 调用 wrapper,传递左值wrapper(foo, a);   // 输出: Lvalue reference called: 10// 调用 wrapper,传递右值wrapper(foo, 20);  // 输出: Rvalue reference called: 20return 0;
}

在这个例子中,wrapper 函数模板通过 std::forward 来实现完美转发:

  • wrapper(foo, a) 被调用时,a 是一个左值,因此 foo(int& x) 被调用。
  • wrapper(foo, 20) 被调用时,20 是一个右值,因此 foo(int&& x) 被调用。

通过 std::forward,我们能够在传递参数的过程中避免不必要的拷贝和移动,保持参数的原始值类别。

总结

完美转发是在模板编程中通过转发引用T&&)和 std::forward 来保证参数的值类别(左值或右值)不变的一种技术。
它的目的是在模板函数中高效传递参数,避免不必要的拷贝或移动,进而提高程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重启后,idea 依赖爆红

没改动代码,但无法运行java项目 java: -source 1.5 中不支持……表达式/运算符java: 错误: 不支持发行版本 5解决:https://www.cnblogs.com/liu-han/p/16105953.html 文件→项目结构,SDK和项目/模块 语言级别的版本要一致SDK: 1.8 项目语言级别:SDK默认值 模块语言级别:SD…

[亲测]君临九州+单机安装教程+无需虚拟机+GM后台

今天给大家带来一款单机游戏的架设:君临九州,版本号:1.0.12.30。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没…

智慧园区管理系统原型

智慧园区管理系统的构建是一个复杂而系统的工程,它融合了信息化、AI、物联网等多种先进技术,旨在提升园区的管理效率、服务质量以及企业运营效率。 一、明确系统目标和需求 需求收集与分析:首先,需要对园区的实际需求进行全面分析,包括园区类型(如产业园区、办公园区、住…

POI导出excel文件加水印

百分百能用,我用的POI版本是5.2.3,效果如下import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.xs…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

江苏省第二届数据安全技术应用职业技能竞赛初赛WP

一、数据安全解题赛1、ds_0602解题思路题目让我们获取加密文件中的原始数据,解密后提交第六行第二列数据,下载附件,发现里面有两个文件,其中一个是“.enc”结尾,那这里我们得先简单了解一下“.enc”结尾的是什么类型的文件。简单来说“.enc”结尾的文件通常是经过加密的文…

java之使用CompletableFuture入门2

Java 17 -序章 本文介绍用过的 allOf、anyOf 函数的用法。allOf 函数原型两点: 1、没有返回值。 2、参数 cfs 中 任何一个 都不能是 null。anyOf 函数原型两点: 1、有返回值,为 Object。 2、参数 cfs 中 任何一个 都不能是 null。allOf 测试意图: 多个任务正常执行。ben发布…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 发布,新增功能概览VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org集中式日志管理 V…

VMware Aria Operations for Networks 6.13 发布,新增功能概览

VMware Aria Operations for Networks 6.13 发布,新增功能概览VMware Aria Operations for Networks 6.13 - 网络和应用监控工具 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

读数据工程之道:设计和构建健壮的数据系统01数据工程概述

数据工程概述1. 数据工程 1.1. 自从公司开始使用数据做事,数据工程就以某种形式存在了1.1.1. 预测性分析、描述性分析和报告1.2. 数据工程师获取数据、存储数据,并准备数据供数据科学家、分析师和其他人使用 1.3. 数据工程是系统和流程的开发、实施和维护,这些系统和流程接收…

安装socks5的一次尝试

1. 下载并自动配置socks5sudo wget https://ap-guangzhou-1257892306.cos.ap-guangzhou.myqcloud.com/asi/httpsocks5.sh && sh httpsocks5.sh 执行下载脚本 wget —no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh执行安装…

形函数的构造7

形函数构造 构造单元1的一般近似函数 \(\overline{V(x)}^{(1)}\),由于该单元只有两个节点\(x_1\)和\(x_2\),我们选择包含两个参数\(\alpha_1\)和\(\alpha_2\)的近似方程 \[\overline{V(x)}^{(1)}=\alpha_1+\alpha_2\times x \]令试函数与\(V(x)\)在节点\(x_1\)和\(x_2\)处相等…