c++中的包装器 function

文章目录

  • 前言
  • 包装器 function及模板的低效性
  • 修复问题


前言

C++提供了多个包装器(wrapper,也叫适配器adapter)。这些对象用于给其他编程接口提供更一致或更合适的接口。

bind1stbind2ed就是两个适配器,它们让接受两个参数的函数能够与这样的STL算法匹配,即它要求将接受一个参数的函数作为参数。

C++提供了其他的包装器,包括:

  • 模板bind可替代bind1stbind2nd,但更灵活;
  • 模板mem_fn让我们能够将成员函数作为常规函数进行传递;
  • 模板referance_wrapper让我们能够创建行为像引用但可被复制的对象;
  • 包装器function让我们能够以统一的方式处理多种类似于函数的形式

包装器 function及模板的低效性

首先,我们来看看下面这句代码:

ret = func(x);

上面func可能是什么呢?那么func可能是函数名?函数指针?函数对象(仿函数对象)?也有可能
lambda表达式对象?所以这些都是可调用的类型!如此丰富的类型,可能会导致模板的效率低下!

例如我们用下面的代码进行验证:

template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}
double f(double i)
{return i / 2;
}
struct Functor
{double operator()(double d){return d / 3;}
};
int main()
{// 函数名cout << useF(f, 11.11) << endl;// 函数对象cout << useF(Functor(), 11.11) << endl;// lamber表达式cout << useF([](double d)->double { return d / 4; }, 11.11) << endl;return 0;
}

运行得到以下结果:

在这里插入图片描述

函数模板useF() 有一个静态成员 count,可根据它的地址确定模板实例化了多少次。有3个不同的地址代表模板有3个不同的实例化。

修复问题

所以我们可以用包装器 function 来解决这个问题:

template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}
double f(double i)
{return i / 2;
}
struct Functor
{double operator()(double d){return d / 3;}
};
int main()
{// 函数名std::function<double(double)> func1 = f;cout << useF(func1, 11.11) << endl;// 函数对象std::function<double(double)> func2 = Functor();cout << useF(func2, 11.11) << endl;// lamber表达式std::function<double(double)> func3 = [](double d)->double { return d /4; };cout << useF(func3, 11.11) << endl;return 0;
}

这个时候模板就实例化了1次,所以它们的地址相同:

在这里插入图片描述

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

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

相关文章

mysql学习打卡day16

今日成果&#xff1a; select c.customer_id,c.first_name,c.points, Bronze as typefrom customers cwhere c.points < 2000unionselect c.customer_id,c.first_name,c.points, Silver as typefrom customers cwhere c.points between 2000 and 3000 unionselect c.custom…

【.NET Core】多线程之线程池(ThreadPool)详解(二)

【.NET Core】多线程之线程池&#xff08;ThreadPool&#xff09;详解&#xff08;二&#xff09; 在上一篇《【.NET Core】多线程之线程池&#xff08;ThreadPool&#xff09;详解&#xff08;一&#xff09;》中我们详细讲解了&#xff0c;线程池概念&#xff0c;如何应用及…

三、需求规格说明书(软件工程示例)

1&#xff0e;引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2&#xff0e;任务概述 2.1目标 2.2运行环境 2.3条件与限制 3&#xff0e;数据描述 3.1静态数据 3.2动态数据 3.3数据库介绍 3.4数据词典 3.5数据采集 4&#xff0e;功能需求 …

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现定时器

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 文章目录 一、定时器(1) 简介STM32定时器计算公式 (2) 示例代码&#xff08;基本定时功能&#xff09;(3) 仿真效果 &#xff08;基本定时功能&#xff09;(4) 示例代码&#xff08;PWM 呼吸灯&#xff09…

修改Linux 分区 UUID

注意事项修改磁盘 uuid 的时候&#xff0c;磁盘不能被挂载需要先卸载 #/dev/sdb5 硬盘设备分区名称 sudo umount /dev/sdb5 生成UUID的命令[不适合NTFS nfs等windows格式] uuidgen 查看硬盘分区设备名字以及UUID的命令 blkid 修改 exit 2 3 4 #!/bin/bash MY_UUID$(uuidge…

美易makeasy平台:小米汽车雄心勃勃

正文&#xff1a; 在当今这个科技飞速发展的时代&#xff0c;不断有企业家提出宏伟的目标&#xff0c;引领行业向前迈进。近日&#xff0c;小米集团创始人雷军在社交平台上转发央视财经关于小米汽车的报道&#xff0c;并宣布了一个令人瞩目的目标&#xff1a;通过15到20年的不…

【GitHub项目推荐--12306 抢票助手 python】【转载】

这个项目名很干脆&#xff0c;不知道以为是 12306 网站的源码&#xff0c;其实不是这是全 GitHub最德高望重的抢票小助手&#xff0c;功能一直在更新&#xff0c;且现已支持 Python 3.6 以上版本。 开源地址&#xff1a;https://github.com/testerSunshine/12306

利用GPU加速自定义风格图像生成-利用GPU加速结合了ControlNet/ Lora的Stable Diffusion XL

点击链接完成注册&#xff0c;参加本次在线研讨会 https://www.nvidia.cn/webinars/sessions/?session_id240124-31319 随着AI技术的发展, 数字内容创建业务也变得越来越火热。生成式AI模型的发布, 让我们看到了人工智能在各行各业的潜力。您只需要用语言简单描述自己希望看…

【Java】Maven的安装与配置

初识Maven Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09; 提供了一套依赖管理机制 标准化的…

质疑鸿蒙系统的是什么人群?为什么要杠

《HarmonyOSNEXT星空版》已堵住大部分人质疑的嘴。就在本月1月18&#xff0c;华为鸿蒙生态千帆启航仪式正式&#xff0c;HarmonyOSNEXT鸿蒙星河版发布&#xff1a;全面自研。 架构层面&#xff0c;HarmonyOSNEXT不依赖传统的Unix内核和Linux内核&#xff0c;而是实现了AI大模型…

《高教学刊》是什么级别的期刊?是正规期刊吗?是核心期刊吗?

​标题解答 1、《高教学刊》是什么级别的期刊&#xff1f; 省级 2、《高教学刊》是核心期刊吗&#xff1f; 不是&#xff0c;只是封面有核心字样 《高教学刊》刊发高等教育教学与高教理论研究成果&#xff0c;交流高校教学与建设的改革措施和实践经验&#xff0c;探索高等教…

每天五分钟计算机视觉:掌握迁移学习使用技巧

本文重点 随着深度学习的发展,迁移学习已成为一种流行的机器学习方法,它能够将预训练模型应用于各种任务,从而实现快速模型训练和优化。然而,要想充分利用迁移学习的优势,我们需要掌握一些关键技巧。本文将介绍这些技巧,帮助您更好地应用迁移学习技术。 迁移学习的关键…

LeetCode每日一题 | 670. 最大交换

文章目录 题目描述问题分析程序代码 题目描述 原题链接 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 问题分析 由于至多交换一次数字中的任意两位。 因此&#xff0c;我们只需要从右往左遍历&#xff08;从个位开始&#xff0…

高客单价企业必读:私域运营趋势分析与实操技巧

一、深入挖掘&#xff1a;场景洞察的新维度 当我们收到销售的群发信息时&#xff0c;通常会感到被打扰或骚扰&#xff0c;这是因为这些信息通常是基于广泛的受众群体发送的&#xff0c;缺乏针对个体消费者的定制化和个性化。这种缺乏个性化的沟通方式很容易被消费者视为不必要…

Temu活动库存设置多少合适,Temu活动要押金吗?-站斧浏览器

Temu活动库存设置多少合适&#xff1f; 对于Temu活动库存的设置&#xff0c;并没有固定的标准。其设置应根据商品的特性、市场需求、以及您的销售目标等因素进行综合考虑。然而&#xff0c;以下是一些建议&#xff0c;可以帮助您做出决策&#xff1a; 商品特性&#xff1a;某…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字&#xff0c;后面跟上命名空间的名字&#xff0c;结构框架有点类似结构体&#xff08;如图所示&#xff09; 上面的代码我一一进行讲解&#xff1a; 1.我们先来说第三行和main函…

MAXWELL

MAXWELL 一、maxwell是什么 maxwell 官网地址&#xff1a;http://maxwells-daemon.io/ 因为官网是纯英文的&#xff0c;倒是不难懂&#xff0c;但总觉得写的略粗糙&#xff08;也可能笔者英文水平确实拉胯&#xff0c;有待提高&#xff09;。所以还是自己百度了一下。 当my…

测试必须要知道的四个主要阶段

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

力扣hot100 反转链表 指针 递归 一题多解

Problem: 206. 反转链表 文章目录 思路&#x1f496; 迭代 双指针&#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 大佬题解 &#x1f496; 迭代 双指针 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) /*** Definition for …

LLM RAG 多种方式装载LLM的实践

一、大模型系统中检索增强生成&#xff08;RAG&#xff09;的意义 当前大模型在处理特定领域或者高度专业化的查询时表现出知识缺失&#xff0c;当所需信息超出模型训练数据范围或需要最新数据时&#xff0c;大模型可能无法提供准确答案。基于行业SOP、行业标准、互联网实时信…