C++中把Lambda 表达式作为参数传递给模板函数。

例子:


template<class fun>
void mytest(fun f)
{_string s1 = "abc";_string s2 = "abc";if (f(s1, s2)){std::cout << "相等。\n";}}int main()
{mytest([](const _string s1, const _string& s2) { return s1 == s2; });return 0;}

输出:

下面是模拟C++标准库的应用:

#include "X:\Work\Share\CCode\CPlatform\MathExt\_MathExt_out.h"using namespace lf;
using namespace std;int main()
{std::string  s1 = "abcd1111";s1.erase(std::find_if(s1.rbegin(), s1.rend(), [](char ch) { return ch != '1'; }).base(), s1.end());_string s2 = "abcd1111";s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(), [](char ch) { return ch != '1'; }).std_base(), s2.end());std::cout  << "s1=" << s1 << "\n";_pcn(s2);}

输出:

代码:

/*******************************************************************************************
文件名							: _xutility.h作者								: 李锋功能								: 模拟 <xutility>创建时间							: 2024年04月21日最后一次修改时间				    :  2024年04月21日
********************************************************************************************/
#pragma once;
#include "_Macro.h"_LF_BEGIN_/*
_EXPORT_STD template <class _Category, class _Ty, class _Diff = ptrdiff_t, class _Pointer = _Ty*,class _Reference = _Ty&>
struct _CXX17_DEPRECATE_ITERATOR_BASE_CLASS iterator { // base type for iterator classesusing iterator_category = _Category; //表示迭代器的类别,例如输入、输出、前向、双向或随机访问等。using value_type        = _Ty; //表示迭代器所指向元素的类型。using difference_type   = _Diff; //表示迭代器之间的差值类型,默认为ptrdiff_t。using pointer           = _Pointer; //表示迭代器所指向元素的指针类型。using reference         = _Reference; //表示迭代器所指向元素的引用类型。
};_CXX17_DEPRECATE_ITERATOR_BASE_CLASS是一个宏定义,用于在C++17中标记迭代器基类
(如std::iterator)的弃用。这个宏定义通常用于告知开发者,该迭代器基类在未来的版
本中可能会被移除或更改,建议使用其他替代方案。_EXPORT_STD是一个宏定义,通常用于在标准库的头文件中。它的作用是在编译时将一些符号标记为导出(export),
以便在其他模块中使用。这样做的目的是避免在链接时出现重复定义的错误。然而,这个宏在C++17中已经被移除,
因为它与模块化的支持有关,而模块化在C++17中并未完全实现。
*//// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="Isbackward"></typeparam>
/// <typeparam name="Step"></typeparam>
/// 创建时间:2024-04-21    最后一次修改时间:2024-04-21 
template <typename T, size_t Step = 1, bool Isbackward = true>
class _iterator_base { 
public:T* _pt;
public:inline _iterator_base(const T* pt) : _pt((T*)pt) {}
public:/// <summary>/// 类型转换/// </summary>inline operator const T* () const { return _pt; }/// <summary>/// 前置加加/// </summary>/// <returns></returns>_iterator_base& operator++() {//效率高if (Isbackward)_pt = _pt + Step;else_pt = _pt - Step;return *this;}/// <summary>/// 后置加加/// </summary>/// <param name=""></param>/// <returns></returns>_iterator_base operator++(int) {   _iterator_base oldvalue = *this;if (Isbackward)_pt = _pt + Step;else_pt = _pt - Step;return oldvalue;}/// <summary>/// 前置减减/// </summary>/// <returns></returns>inline _iterator_base& operator--() {if (Isbackward)_pt = _pt - Step;else_pt = _pt + Step;return *this;}/// <summary>/// 后置减减/// </summary>/// <param name=""></param>/// <returns></returns>_iterator_base operator--(int){_iterator_base oldvalue = *this;if (Isbackward)_pt = _pt - Step;else_pt = _pt + Step;}inline bool operator==(const _iterator_base& right) {return _pt == right._pt;}inline bool operator<(const _iterator_base& right) {if (Isbackward)return _pt < right._pt;elsereturn _pt > right._pt;        }inline bool operator<=(const _iterator_base& right) {if (Isbackward)return _pt <= right._pt;elsereturn _pt >= right._pt;}inline bool operator>(const _iterator_base& right) {if (Isbackward)return _pt > right._pt;elsereturn _pt < right._pt;}// 解引用操作符重载inline const T& operator*() const{  return *_pt;   }/*// 获取原始指针的操作符重载T* operator->() const {return _pt;}*/inline const T* std_base() { return _pt; }
};template <typename T>
class _iterator : public _iterator_base<T,1,true>
{
public:inline _iterator(const T* pt) : _iterator_base<T, 1, true>(pt) {}
};template <typename T>
class _reverse_iterator : public _iterator_base<T, 1, false>
{
public:inline _reverse_iterator(const T* pt) : _iterator_base<T, 1, false>(pt) {  }     
};/// <summary>
/// 模拟std::find_if
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="fun"></typeparam>
/// <param name="first"></param>
/// <param name="last"></param>
/// <param name="pred"></param>
/// <returns></returns>
/// 创建时间:2024-04-21    最后一次修改时间:2024-04-22 
template <class T, class fun>
_reverse_iterator<T> _find_if(const _reverse_iterator<T>& first,const _reverse_iterator<T>& last, fun pred) {/*  用法std::string s1 = "0abc023030000";s1.erase(std::find_if(s1.rbegin(), s1.rend(),[](char ch) { return ch != '0'; }).base(), s1.end());std::cout << "s1=" << s1 << "\n";_string s2 = _t("0abc023030000");s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(),[](wchar_t ch) { return ch != _t('0'); }).std_base(), s2.std_end());std::wcout << _t("s2=") << s2 << _t("\n");*/_reverse_iterator<T> itStart = first;++itStart;for (; itStart <= last; itStart++) {if (pred(*itStart)) {return itStart + 1; //符合条件字符串的下一位置。}}return last;
}_LF_END_

_string中的代码:

	/// <summary>/// 模拟std::string::erase/// </summary>/// <param name="first"></param>/// <param name="last"></param>/// <returns></returns>/// 创建时间: 2024-04-21      最后一次修改时间:2024-04-22_Str<T>& std_erase(const _iterator<T>& first, const _iterator<T>& last) {/*std::string s1 = "0abc023030000";s1.erase(std::find_if(s1.rbegin(), s1.rend(),[](char ch) { return ch != '0'; }).base(), s1.end());std::cout << "s1=" << s1 << "\n";_string s2 = _t("0abc023030000");s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(),[](wchar_t ch) { return ch != _t('0'); }).std_base(), s2.std_end());std::wcout << _t("s2=") << s2 << _t("\n");*/_Str<T> tmp(_t(""), _nLength);const T* pf = first;T* pl = (T*)(const T*)last;int n = pf - _pData;//拷贝前半部分if (n > 0){for (int i = 0; i < n; ++i){tmp.Add(*(_pData + i));}}++pl;//拷贝后半部分while (*pl)	{tmp.Add(*pl);++pl;}//清除字符,注意,在这里不要清除内存this->Clear();this->Add(tmp); //拷贝进来return *this;}

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

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

相关文章

贪心-区间问题

区间选点和最大不相交区间数量 区间选点问题描述 问题描述 给定 N个闭区间 [ai,bj]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N&…

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中&#xff0c;异常是程序执行时发生的错误。当Python检测到一个错误时&#xff0c;它会引发一个异常&#xff0c;这可能是由于多种原因&#xff0c;如尝试除以零、访问不存在的文件&#xff0c;或者尝试从列表中获取不存在的索引等。异常处…

数组的拷贝

数组的拷贝 文章目录 数组的拷贝浅拷贝内存分析 深拷贝内存分析 浅拷贝 概念&#xff1a;数组的浅拷贝是指新数组保存的是原数组的内存地址&#xff0c;并没有拷贝真正的值&#xff0c;如果原数组的内容发生改变那么新数组的内容也会发生相应改变。 代码实现&#xff1a; pu…

C语言/数据结构——每日一题(合并两个有序链表)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;今天我在LeetCode看到了一道单链表题&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists想着和大家分享一下&#xff0c;废话不多说&#xff0c;让我们开始今天的题目分享吧。 二.正文 1.1题目描述 1.2题…

phpstudy 搭建 upload-labs 文件上传靶场

phpstudy 搭建靶场&#xff1a;下载安装好phpstudy后&#xff0c;下载靶场源码&#xff1a; upload-labs下载地址&#xff1a; https://github.com/c0ny1/upload-labs 下载完压缩文件&#xff0c;解压文件&#xff0c;解压后的文件夹命名为upload--labs 将解压后到文件夹放…

python 关键字(import)

4、import 在Python编程中&#xff0c;import 是一个至关重要的关键字&#xff0c;它用于导入其他Python模块或库中的代码&#xff0c;以便在当前程序中使用。无论是Python新手还是经验丰富的开发者&#xff0c;都需要对import有深入的理解。 基础知识&#xff1a;import 的基…

docker如何生成springboot镜像

1、在springboot的jar包所在的目录下创建Dockerfile文件&#xff0c;此案例的目录为/usr/java Dockerfile的文件内容如下&#xff1a; FROM openjdk:8 LABEL author"zengyanhui" LABEL email"1181159889qq.com" WORKDIR /usr/java/springbootdemo COPY s…

路径规划 | 详解混合A*算法Hybrid A*(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 为什么需要Hybrid A*算法?2 Hybrid A*算法原理2.1 基本流程2.2 运动学约束启发式2.3 基于维诺图的路径耗散2.4 连续性节点扩展3 算法仿真3.1 ROS C++ 仿真3.2 Python仿真3.3 Matlab仿真0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(六)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第十四章、第十五章、第十六章。 目…

机器人系统ros2-开发实践04-ROS 2 启动文件管理大型项目的最佳实践

机器人上的大型应用通常涉及多个互连的节点&#xff0c;每个节点可以有许多参数。海龟模拟器中模拟多只海龟就是一个很好的例子。海龟模拟由多个海龟节点、世界配置以及 TF 广播器和监听器节点组成。在所有节点之间&#xff0c;存在大量影响这些节点的行为和外观的 ROS 参数。 …

《与 Apollo 共创生态——Apollo7周年大会干货分享》

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 阿波罗X企业自动驾驶解决方案自动驾驶技术提升与挑战自动驾驶系统功能与性能的详细解析<td alig…

python可视化学习笔记折线图问题-起始点问题

问题描述&#xff1a; 起始点的位置不对 from pyecharts.charts import Line import pyecharts.options as opts # 示例数据 x_data [1,2,3,4,5] y_data [1, 2, 3, 4, 5] # 创建 Line 图表 line Line() line.add_xaxis(x_data) line.add_yaxis("test", y_data) li…

数字阅览室的优势

近年来&#xff0c;随着我国社会经济的快速发展&#xff0c;信息技术的发展也得到了广泛的应用&#xff0c;我国高校图书馆和图书管理系统进入了快速发展的快车道。在这种环境下&#xff0c;数字化阅览室在校园中非常流行。数字阅览室是一套真正意义上的面向中小学图书管理、浏…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

系统设计与建模

2022年DFD、E-R、数据流图和数据字典在需求分析和设计阶段的作用2021年用例图、顺序图、协作图与顺序图的区别 对象模型、动态模型、功能模型 2020年逻辑数据模型设计过程包含的任务、超类实体、派生属性2019年DFD、数据流图和系统流程图的区别2018年DFD、E-R、实体与类的区别2…

python基础语法--函数

一、函数概述 函数就是执行特定任务完成特定功能的一段代码。可以在程序中将某一段代码定义成函数&#xff0c;并指定一个函数名和接收的输入&#xff08;参数&#xff09;&#xff0c;这样就可以在程序的其他地方通过函数名多次调用并执行该段代码了。 每次调用执行后&#…

【华为】路由综合实验(基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

AI 图像无损放大器:多平台支持,轻松上手 | 开源日报 No.241

upscayl/upscayl Stars: 25.5k License: AGPL-3.0 upscayl 是一个免费开源的 AI 图像放大器&#xff0c;支持 Linux、MacOS 和 Windows 平台&#xff0c;并且秉承着“Linux 优先”理念构建。 使用先进的 AI 算法对低分辨率图像进行放大和增强在不损失质量的情况下放大图像&am…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

python Django REST framework允许你根据API的版本提供不同的行为或数据

在Django REST framework中,版本控制是一个重要的功能,它允许你根据API的版本提供不同的行为或数据。以下是如何在Django REST framework中设置API版本控制的几种方法: 1. 使用URL路径参数 你可以通过URL路径中的参数来指定API的版本。例如: python复制 # urls.py from …