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

news2025/1/17 9:03:28

例子:


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 classes
    using 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;
        else
            return _pt > right._pt;        
    }


    inline bool operator<=(const _iterator_base& right) {
        if (Isbackward)
            return _pt <= right._pt;
        else
            return _pt >= right._pt;
    }


    inline bool operator>(const _iterator_base& right) {
        if (Isbackward)
            return _pt > right._pt;
        else
            return _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.coloradmin.cn/o/1628243.html

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

相关文章

Arduino Nano 33 BLE Sense Rev2 IMU例程及变砖抢救方法

最近在玩 Nano 33 BLE Sense Rev2&#xff0c;先试了个网上的IMU例子&#xff0c;结果程序下载进去&#xff0c;串口显示"Failed to innitialize IMU"&#xff0c;有点小郁闷&#xff0c;只能放狗搜&#xff0c;结果网上也有老兄遇到类似问题&#xff0c;真是病急乱投…

四数之和 ---- 双指针

题目链接 题目: 分析: 我们已经知道三数之和如何求取, 并去重了 三数之和 那么四数之和同理, 需要固定两个数a和b 然后用"双指针算法" , 只要两指针之和等于target-a-b即可同样对于四个数都要进行去重 代码: class Solution {public List<List<Integer>…

为什么总说抖店做不好?做抖店需要注意这些问题,是不是都占了?

大家好&#xff0c;我是电商花花。 今天给大家总结了4个新手不注意又常犯的几个原因&#xff0c;这些建议都是我们做店这些年的实操经验&#xff0c;可以帮助大家做店自查&#xff0c;有责改之&#xff0c;无责加冕。 1、抖店核心是选品而不是玩法 很多新手在刚开始做店抖音小…

各省财政涉农支出统计数据集(2001-2022年)

01、数据简介 财政涉农支出是指在政府预算中&#xff0c;用于支持农业、农村和农民发展的财政支出。这些支出旨在促进农村经济的发展&#xff0c;提高农民收入&#xff0c;改善农村生产生活条件&#xff0c;推进农业现代化。 在未来的发展中&#xff0c;各省将继续加大财政涉…

移远通信再推系列高性能卫星、5G、GNSS及三合一组合天线

4月23日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;再次推出多款高性能天线产品&#xff0c;以进一步满足物联网市场对高品质天线产品的需求。 其中包括卫星天线YETN001L1A、三合一组合天线YEMA300QXA和YEMN302Q1A&#xff0c;外部5G天线YECN…

SDM模型——建模用户长短期兴趣的Match模型

1. 引言 SDM模型(Sequential Deep Matching Model)是阿里团队在2019年CIKM的一篇paper。模型属于序列召回模型&#xff0c;研究的是如何通过用户的历史行为序列去学习到用户的丰富兴趣。 SDM模型把用户的历史序列根据交互的时间分成了短期和长期两类&#xff0c;然后从短期会…

计算机视觉的应用29-卷积神经网络(CNN)中的变种:分组卷积、转置卷积、空洞卷积的计算过程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用29-卷积神经网络(CNN)中的变种&#xff1a;分组卷积、转置卷积、空洞卷积的计算过程。分组卷积将输入通道分为几组&#xff0c;对每组独立进行卷积操作&#xff0c;以减少计算量和模型参数。转置卷…

K8S探针分享

一&#xff0c;探针介绍 1 探针类型 livenessProbe&#xff1a;存活探针&#xff0c;用于判断容器是不是健康&#xff1b;如果探测失败&#xff0c;Kubernetes就会重启容器。 readinessProbe&#xff1a;就绪探针&#xff0c;用于判断是否可以将容器加入到Service负载均衡池…

Vue 组件分类、局部注册和全局注册

文章目录 背景知识组件分类安装 vue-cli示例设置组件局部注册设置组件全局注册 背景知识 开发 Vue 的两种方式&#xff1a; 核心包传统开发模式&#xff1a;基于 html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工…

什么是数字化运营?

目录 一、什么是数字化运营&#xff1f; 二、数字化运营的重要性是什么&#xff1f; 三、数字化运营的具体步骤和措施是什么&#xff1f; 四、数据化决策是什么&#xff1f; 一、什么是数字化运营&#xff1f; 数字化运营是利用数字技术和数据分析来优化企业的业务流程和运…

QC8585 封装SOP-7 控制器芯片

QC8585是一款适合于智能手机充电器和其他低功率AC-DC电源适配器的PWM控制器。它因其高效率、高集成度和多种保护功能而受到许多电源制造商的青睐。下面是一些可能的应用案例&#xff1a; 快速充电器&#xff1a;使用QC8585的智能手机充电器可以支持快速充电技术&#xff0c;能…

Vitis HLS 学习笔记--C/C++ static 关键字的作用

目录 1. 简介 2. c/c共有性质 3. c独有性质 4. 示例说明 5. static 对于 HLS 工具的影响 6. 总结 1. 简介 在Vitis HLS中&#xff0c;偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C语言&#xff0c;有必要理解这两种语言中static关键字细微差异。本文旨在梳理…

Compose和Android View相互使用

文章目录 Compose和Android View相互使用在Compose中使用View概述简单控件复杂控件嵌入XML布局 在View中使用Compose概述在Activity中使用Compose在Fragment中使用Compose布局使用多个ComposeView 在布局中使用Compose 组合使用 Compose和Android View相互使用 在Compose中使用…

web自动化系列-selenium的下拉框定位(十三)

在功能操作过程中 &#xff0c;遇到下拉列表是很正常的事 &#xff0c;比如像一些查询条件就都是使用的是下来列表 。所以 &#xff0c;selenium也需要支持对下拉框的操作 。 1.下拉列表 在selenium中&#xff0c;也提供了一个下拉列表操作的类 &#xff1a;Select . 以下为该…

C语言学习/复习35

一、语言文件操作 1.章节重点 注意事项1&#xff1a;可变参数 、

使用NGINX做局域网内 浏览器直接访问链接 拓展外网链接访问本地

达成目的功能&#xff1a; 在本地服务的一个文件路径下&#xff0c;局域网内用ip和路径名访问到对应的地址&#xff1b;如 10.5.9.0/v1 即可访问到 某个固定本地地址目录 V1下&#xff0c;名为index.html的文件。前言 NGINX 是一个非常流行的开源 Web 服务器和反向代理服务器…

【踩坑日记】SpringBoot集成Kafka,消息没有按照顺序消息问题【已解决】

背景 作为一个合格的码农&#xff0c;当然要学会CV大法了&#xff0c;可是CV也是有风险的&#xff0c;别以为前任写的已经上线那么久了没有问题… 我们需要将埋点信息上报到一个三方平台&#xff08;S2S&#xff09;接口&#xff0c;三方平台对时间有要求&#xff0c;同一个用…

【工具】-根源上解决VScode打印输出乱码的问题

目录 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致2 第二步&#xff1a; 更改VScode的编码格式-保持一致 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致 看一下你的控制台的编译的命名后缀&#xff0c;有两个关键的参数&#xff0c;如下图&#xff1a; “-f…

预测性营销在业务经营中的实践:开源AI名片商城系统小程序的应用与实例

在数字化浪潮中&#xff0c;预测性营销已经成为企业获取市场竞争优势、推动业务增长的关键手段。而开源AI名片商城系统小程序&#xff0c;作为一种融合了先进技术和智能分析能力的工具&#xff0c;为企业在业务经营中实现预测性营销提供了有力支持。 首先&#xff0c;让我们通过…

神经网络中多层卷积的作用

在神经网络中采用多层卷积的目的是为了逐步提取和组合图像的抽象特征&#xff0c;从而更有效地学习数据的表示并执行复杂的任务。不同层的卷积具有不同的作用&#xff0c;从较低层次的特征&#xff08;例如边缘、纹理&#xff09;到较高层次的抽象特征&#xff08;例如物体部件…