当前位置: 首页 > news >正文

C++完美转发实现

C++完美转发实现

完美转发允许函数模板将参数以原始的值类别(左值或右值)转发给其他函数。这是实现通用包装器和工厂函数的关键技术。

万能引用(转发引用)使用T&&语法,可以绑定到任何值类别。

#include
#include
#include

void process(int& x) {
std::cout << "Lvalue reference: " << x << "\n";
}

void process(int&& x) {
std::cout << "Rvalue reference: " << x << "\n";
}

template
void forward_call(T&& arg) {
process(std::forward(arg));
}

void forwarding_basic() {
int x = 42;
forward_call(x);
forward_call(100);
}

std::forward保持参数的值类别。

template
void wrapper(T&& arg) {
std::cout << "Forwarding...\n";
process(std::forward(arg));
}

完美转发可以实现工厂函数。

template
T* create(Args&&... args) {
return new T(std::forward(args)...);
}

class Widget {
std::string name_;
int value_;

public:
Widget(const std::string& name, int value)
: name_(name), value_(value) {
std::cout << "Widget constructed: " << name_ << ", " << value_ << "\n";
}

Widget(std::string&& name, int value)
: name_(std::move(name)), value_(value) {
std::cout << "Widget move-constructed\n";
}
};

void factory_example() {
std::string name = "test";
Widget* w1 = create(name, 42);
Widget* w2 = create("temp", 100);

delete w1;
delete w2;
}

完美转发可以实现包装器类。

template
class FunctionWrapper {
Func func_;

public:
explicit FunctionWrapper(Func f) : func_(f) {}

template
auto operator()(Args&&... args) {
std::cout << "Before call\n";
auto result = func_(std::forward(args)...);
std::cout << "After call\n";
return result;
}
};

int add(int a, int b) {
return a + b;
}

void wrapper_example() {
FunctionWrapper wrapped(add);
int result = wrapped(10, 20);
std::cout << "Result: " << result << "\n";
}

引用折叠规则决定最终的引用类型。

template
void show_type(T&& arg) {
if (std::is_lvalue_reference::value) {
std::cout << "Lvalue reference\n";
} else if (std::is_rvalue_reference::value) {
std::cout << "Rvalue reference\n";
} else {
std::cout << "Not a reference\n";
}
}

void reference_collapsing() {
int x = 42;
show_type(x);
show_type(100);
}

完美转发在标准库中广泛使用。

#include
#include

void standard_library_forwarding() {
auto ptr = std::make_unique("test", 42);

std::vector vec;
vec.emplace_back("widget1", 10);
vec.emplace_back("widget2", 20);
}

完美转发是现代C++泛型编程的核心技术。

http://www.jsqmd.com/news/863705/

相关文章:

  • 2026沭阳县黄金回收白银回收铂金回收店铺实力排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 如何通过3个核心机制彻底改变炉石佣兵战记的游戏体验?
  • 2026顺昌县黄金回收白银回收铂金回收店铺实力排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 周口市黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • 2026太谷县黄金回收白银回收铂金回收店铺实力排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 2026 年,个人开发首选是直接走原生还是走 RN 或 Flutter?
  • kubectl-node-shell实战案例:如何解决Talos等无文件系统节点的调试难题
  • 周宁县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • Raw Accel终极指南:掌握Windows内核级鼠标加速的完整教程
  • 深度解析WenQuanYi Micro Hei:构建企业级跨平台中文显示解决方案的3大支柱架构
  • 垣曲县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • LinkSwift:基于JavaScript的多网盘直链解析技术方案
  • 26绵阳黄金回收真实测评!3家门店亲测对比,本地人卖金避坑指南 - 恒顺黄金回收
  • 3分钟找回消失的快捷键:Windows热键侦探帮你揪出幕后黑手
  • 理查德米勒海瑞温斯顿梵克雅宝合肥二手腕表行情报价参考 - 李宏哲1
  • 原平县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • 如何构建企业级权限系统:OpenFGA高性能授权引擎的终极指南
  • 终极免费文档下载指南:kill-doc让你轻松获取百度文库等30+平台资源
  • 驻马店市黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • 余生黄金回收资质全|济南合规黄金回收 实名登记全程监控更放心 - 润富黄金珠宝行
  • Milton与ImGui集成:现代UI设计在绘画软件中的应用
  • 资溪县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • 烟台芝罘瑾福黄金珠宝店:聊城专业的银元回收公司推荐几家 - LYL仔仔
  • 5步实现《鸣潮》游戏体验全面升级:WuWa-Mod模组高效部署指南
  • 广州至美广告装饰:增城广告门头招牌安装公司推荐几家 - LYL仔仔
  • 原阳县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭
  • 2026年哈尔滨生成式引擎优化服务机构深度评估及3家优选方案解析 - 产业观察网
  • 3分钟学会:在PowerPoint中插入LaTeX公式的终极指南
  • 2026 年 05 月 22 日广州花都区黄金回收:金银传奇、汇鑫阁老店高价回收 - 新闻全知道
  • 岳西县黄金回收哪家强?铭润稳居第一 - 亦辰小黄鸭