C++基础3:仿函数

2023-11-19

系列文章目录

C++基础:开篇
C++基础1:从const关键字看变量的基础单元-类
C++基础2:构造函数、拷贝构造、赋值运算符重载



前言

C++的仿函数技术是基于C++的运算符重载实现的,这项技术广泛应用于STL(标准模板库)中,本篇来讲解一下该技术。


一、什么是仿函数?

简单来说,仿函数就是让一个类用起来像函数。我们都知道函数的调用格式是“函数名+()”,括号里面是形参列表。该格式典型的特征是用"()"去调用函数。那么如何才能让一个类,也具备这样的特征呢?这就需要用到C++的运算符重载技术。下面我们看实例代码。

二、实现步骤

1.定义类

class opt_add
{
public:
	opt_add()
	{
	}
};

2.重载()运算符

class opt_add
{
public:
	opt_add()
	{
	}
	
	int operator()(int a,int b)
	{
		return a+b;
	}
};

3.使用仿函数

#include <iostream>
#using namespace std;
void main()
{
	opt_add myAdd;
	int a = 1;
	int b = 2;
	
	cout << "a+b=" << myAdd(a,b) << endl;
}

输出结果如下:

a+b=3

如以上代码所示,我们可以像使用函数一样,使用类。

此处再做一下扩展,可以把仿函数做成模板类,这样就可以对任意任意类型进行仿函数操作。

4.仿函数结合模板

template <typename T>
class opt_add
{
public:
	opt_add()
	{
	}

	T operator()(T a, T b)
	{
		return a + b;
	}
};

void main()
{
	opt_add<int> myAdd;
	int a = 1;
	int b = 2;
	
	cout << "a+b=" << myAdd(a,b) << endl;
}

由于类模板没办法做类型推断,我们在定义类时,需要明确指明类型。像这样

opt_add<int> myAdd;

我们知道函数模板可以做类型推断。我们可以使用函数模板来简化仿函数的使用。

5.用函数模板简化仿函数调用

我们需要一个辅助函数,如下:

template<typename T>
T call_opt_add(T a, T b)
{
	opt_add<T> opt;

	return opt(a, b);
}

使用辅助函数调用仿函数:

#include <iostream>
#using namespace std;
void main()
{
	int a = 1;
	int b = 2;

	double c = 3.3;
	double d = 1.5;
	
	cout << "a+b=" << call_opt_add(a,b) << endl;
	cout << "c+d=" << call_opt_add(c,d) << endl;
}

运行结果如下:

a+b=3
c+d=4.8

总结

仿函数是STL的六大部件之一,与之相关的还有仿函数适配器。关于仿函数适配器,我们后续会单独出一篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础3:仿函数 的相关文章

随机推荐

  • MATLAB ARMA时间序列分析引导——理解与应用

    MATLAB ARMA时间序列分析引导 理解与应用 引言 时间序列分析是一种重要的数据分析方法 广泛应用于金融 经济 自然科学等领域 ARMA模型是时间序列分析中常用的模型之一 它可以帮助我们预测未来的数值趋势和特征 以便做出相应的决策 本
  • 百度Apollo7.0轨迹规划模块

    百度Apollo 7 0 轨迹规划模块是一种用于自动驾驶汽车的软件工具 其中包含了一组算法和工具 用于在道路上规划车辆的路线和轨迹 这个模块能够考虑车辆的动态特性 如转弯半径 最大转弯角度和最大加速度等 并能够在实时环境中规划车辆的路线 此
  • 记一次关于uni的公共样式使用遇到的坑

    今天在使用uniapp开发小程序时遇到一个问题 在app vue中引入公共样式 在其他界面中使用 直接运行到小程序模拟器上时 是可以正常使用的 但是如果分包放到小程序上公共样式就会失效 在网上找了半天也没找到问题所在 后边瞎写的的时候偶然解
  • OpenStack rdo一键allinone部署

    目录 1 环境准备 2 配置阿里yum源 3 安装openstack 4 安装packstack软件包 5 执行一键部署命令 6 遇到一些问题 7 登录OpenStack 1 环境准备 CentOS7 最小化安装 设置静态IP 编辑 vi
  • 关于求职及面试的一些小技巧

    关于面试的一些小窍门 内容仅代表我个人观点 欢迎批评指正 之前已经分享过怎么样做一份看起来还算不错的简历了 老司机的分享 写简历的过程中 都有哪些坑 点开即可查看 1 关于面试时机 对相当一部分的部门需求者而言 如果求职者不是绝对的让部门需
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • “大三在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

    博主大三在读 投的是字节 Data 的后端开发实习生 base 杭州 时间线 4 12 投递 4 13 安排简历筛选 4 14 安排面试 4 19 16 00 一面 4 22 16 00 二面 4 23 8 00 三面 4 23 16 00
  • 在WINDOW 系统下如何用批处理命令生成代码

    如图要实现一个每次编译都会自动重新生成的代码 一般是 软件版本相关的代码最适合这种自动生成 上图中需在用到编译时间和日期 来直接上代码 BEGIN COLOR 07 cls echo off ECHO ECHO 自动生成软件版本号 ECHO
  • Discuz 如何设置SSL类型的SMTP邮箱

    由于国际与国内均对垃圾邮件进行严格管控 我国 互联网信息服务管理办法 中国互联网协会反垃圾邮件规范 均对垃圾邮件进行说明与管理规范 鉴于服务器25端口被大量垃圾邮件充斥 严重影响广大用户正常使用 很多服务器不再提供25端口邮件服务 包括进站
  • QNX系统的ftp调试,连接FTP调试-QNX的PC104调试ftp

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com 板子上QNX系统ftp的调试 双网卡 IP分别为 192 192 1 10 192 192
  • Qt编程学习笔记

    新建项目 gt 其他项目 gt Empty qmake Project 添加新文件 项目 gt run gt Run in terminal 发现cin gt gt a无法向a输入数据 检查 pro文件发现缺少参数CONFIG consol
  • chrome黑暗模式设置

    1 前言 使用Chrome有很久了 但一直没发现有令人满意的黑暗模式 期间试过通过在谷歌商店中安装黑暗主题 但感觉不好 主要有以下 除了chrome的界面是黑暗模式外 打开其它的页面还是亮模式 我希望黑暗模式支持以下特性 chrome的标签
  • Android ViewPager实现导航页效果

    效果 源码地址 文章翻译自 https www cnblogs com aademeng articles 6238933 html 代码 MainActivity public class MainActivity extends App
  • mysql APPARENT DEADLOCK!!! Complete Status:Managed Threads: 3 (c3p0,druid)

    问题场景 由于在生产环境出现问题 应用挂掉 作为菜鸟运维 解决问题有点忙手忙脚 线上bug修复 重启tomcat 启动报错 错误截图在下面 根据日志分析像是死锁 使用C3P0连接池 tomcat启动完之后 还能正常运行 解决问题经过 网上有
  • v4l2在帧缓冲区预览摄像头

    在应用层通过v4l2 api将采集的摄像头数据yuv转为rgb后写到帧缓冲区达到预览摄像头的目的 程序运行后切换到tty下就可以看到 我的屏幕是bgra格式的 这点要注意 不同屏幕格式不同 不同r g b的偏移通过修改 0x00 lt lt
  • Activiti定时器事件

    定时器事件用于在特定的日期 时间或者周期触发一个事件 它们可以用做开始事件 中间事件 边界事件 边界事件可以是中断的 也可以是非中断的 默认是中断事件 即当触发定时器时 原执行实例会被删除 开始事件定时器 定时器开始事件用于在指定的时间点或
  • 专利检索工具网站分享

    当今有很多专利检索工具可供使用 以下是一些常用的专利检索工具网站 全球专利数据库 https patentscope wipo int search zh search jsf 中国专利数据库 http www pss system gov
  • 爬虫从入门到放弃——开源爬虫框架

    本文参考自知乎 供本人学习使用 作者 老夏 链接 https www zhihu com question 27042168 answer 70821088 目前主流的网络爬虫框架包括但不限于 Nutch Crawler4j WebMagi
  • java yaml配置处理,yaml格式化,yaml节点增加,删除。多yaml合并

    多环境配置文件管理 增加一个配置属性 多套环境配置文件需同时增加 如果忘记了 那么就报错 对多环境配置文件进行管理 使用yaml作为文件时 就涉及到yaml的一些解析 修改 新增操作 java管理yaml 1 环境依赖 2 snakeyam
  • C++基础3:仿函数

    系列文章目录 C 基础 开篇 C 基础1 从const关键字看变量的基础单元 类 C 基础2 构造函数 拷贝构造 赋值运算符重载 文章目录 系列文章目录 前言 一 什么是仿函数 二 实现步骤 1 定义类 2 重载 运算符 3 使用仿函数 4