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

move与函数指针的简单使用

std::move()

C++11的标准库 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。

就是说 std::move(str); 之后原来的值因为变成了右值失效了
但是这样赋值可以避免出现拷贝

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main()
{string str = "hello";cout << "before str: " << str << endl;vector<string> vstr;vstr.emplace_back(std::move(str));cout << "after  str: " << str << endl;return 0;
}

str 就没有了因为被转移语义了


#include <iostream>
#include <functional>
#include <utility>
#include "tinyNetWorkLib.h"
class People{using actionEvent = std::function<void()>;public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry = std::move(func); }void setSimleEvent(actionEvent func){ smile = std::move(func);}void handleEvent(Timestamp receiverTime){if(value >= 0){smile(); cout<<receiverTime.toFormattedString()<<endl;}else{cry();cout<<receiverTime.toFormattedString()<<endl;}}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::function<void()> func = []{std:: cout<<"happy"<<std::endl;       };std::function<void()> func2 = []{std::cout<<"cry"<<std::endl;};People peo;peo.setCryEvent(func2);peo.setSimleEvent(func);peo.handleEvent(Timestamp ::now());// std::cout << "Hello world" << std::endl;return 0;
}

执行结果

happy
2023/08/27 20:49:59

这里函数指针还能用,因为这里转移语义的对象是参数

给出依赖文件的代码Timestamp 复制下来用就好

记得给个#ifndef这里自己

#include <functional>
#include <set>
#include <sys/time.h>
#include <sys/eventfd.h>
#include <fcntl.h>
#include <unistd.h>
#include  <mutex>
#include<unordered_map>
using namespace std;
class Timestamp
{
public:Timestamp(): microSecondsSinceEpoch_(0){}explicit Timestamp(int64_t microSecondsSinceEpoch): microSecondsSinceEpoch_(microSecondsSinceEpoch){}// 获取当前时间戳static Timestamp now();//用std::string形式返回,格式[millisec].[microsec]std::string toString() const;//格式, "%4d年%02d月%02d日 星期%d %02d:%02d:%02d.%06d",时分秒.微秒std::string toFormattedString(bool showMicroseconds = false) const;//返回当前时间戳的微妙int64_t microSecondsSinceEpoch() const { return microSecondsSinceEpoch_; }//返回当前时间戳的秒数time_t secondsSinceEpoch() const{ return static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); }// 失效的时间戳,返回一个值为0的Timestampstatic Timestamp invalid(){return Timestamp();}// 1秒=1000*1000微妙static const int kMicroSecondsPerSecond = 1000 * 1000;private:// 表示时间戳的微秒数(自epoch开始经历的微妙数)int64_t microSecondsSinceEpoch_;
};/*** 定时器需要比较时间戳,因此需要重载运算符*/
inline bool operator<(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch();
}inline bool operator==(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch();
}// 如果是重复定时任务就会对此时间戳进行增加。
inline Timestamp addTime(Timestamp timestamp, double seconds)
{// 将延时的秒数转换为微妙int64_t delta = static_cast<int64_t>(seconds * Timestamp::kMicroSecondsPerSecond);// 返回新增时后的时间戳return Timestamp(timestamp.microSecondsSinceEpoch() + delta);
}Timestamp Timestamp::now()
{struct timeval tv;// 获取微妙和秒// 在x86-64平台gettimeofday()已不是系统调用,不会陷入内核, 多次调用不会有性能损失.gettimeofday(&tv, NULL);int64_t seconds = tv.tv_sec;// 转换为微妙return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);
}// 2022/08/26 16:29:10
// 20220826 16:29:10.773804
std::string Timestamp::toFormattedString(bool showMicroseconds) const
{char buf[64] = {0};time_t seconds = static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond);// 使用localtime函数将秒数格式化成日历时间tm *tm_time = localtime(&seconds);if (showMicroseconds){int microseconds = static_cast<int>(microSecondsSinceEpoch_ % kMicroSecondsPerSecond);snprintf(buf, sizeof(buf), "%4d/%02d/%02d %02d:%02d:%02d.%06d",tm_time->tm_year + 1900,tm_time->tm_mon + 1,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec,microseconds);}else{snprintf(buf, sizeof(buf), "%4d/%02d/%02d %02d:%02d:%02d",tm_time->tm_year + 1900,tm_time->tm_mon + 1,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec);}return buf;
}

最后我们给出要给第一个版本的channel

一个文件描述符,发生读事件 写时间 关闭事件 错误事
文件描述符就是一个整形变量
int revents 表示这个文件描述符的心情(状态)
通过位运算表示 和EPOLLINT OUT HUB 先不管

#include <functional>
#include "tinyNetWorkLib.h"
#include <sys/epoll.h>class Channel{using EventCallback = std::function<void()>;using ReadEventCallback = std::function<void(Timestamp)>;
public:    Channel(int fd):fd_(fd){};void setReadCallback(ReadEventCallback cb) { readCallback_ = std::move(cb); }void setWriteCallback(EventCallback cb) { writeCallback_ = std::move(cb); }void setCloseCallback(EventCallback cb) { closeCallback_ = std::move(cb); }void setErrorCallback(EventCallback cb) { errorCallback_ = std::move(cb); } void set_revents(int revt){ revents = revt; }void handleWithGuard(Timestamp receiverTime){if(revents & EPOLLHUP && !(revents & EPOLLIN)){if(closeCallback_){closeCallback_();}}if(revents & EPOLLERR){if(errorCallback_){errorCallback_();}    }if(revents & (EPOLLIN|EPOLLPRI)){if(readCallback_){readCallback_(receiverTime);}}if(revents & EPOLLOUT){if(writeCallback_){writeCallback_();}}}private:ReadEventCallback readCallback_;EventCallback writeCallback_;EventCallback closeCallback_;EventCallback errorCallback_;const int fd_;int revents;};

这个和我们People类设计几乎一样除了设计了一点系统知识

#include <iostream>
#include <functional>
#include <utility>
#include "tinyNetWorkLib.h"
#include "Channel.h"
class People{using actionEvent = std::function<void()>;public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry = std::move(func); }void setSimleEvent(actionEvent func){ smile = std::move(func);}void handleEvent(Timestamp receiverTime){if(value >= 0){smile(); cout<<receiverTime.toFormattedString()<<endl;}else{cry();cout<<receiverTime.toFormattedString()<<endl;}}int set_value(int v){value = v;}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::function<void()> func = []{std:: cout<<"happy"<<std::endl;       };std::function<void()> func2 = []{std::cout<<"cry"<<std::endl;};// People peo;// peo.setCryEvent(func2);// peo.setSimleEvent(func);//  peo.handleEvent(Timestamp ::now());// std::cout << "Hello world" << std::endl;// func();Channel chanel(1);chanel.set_revents(EPOLLOUT);chanel.setWriteCallback(func);chanel.handleWithGuard(Timestamp::now());return 0;
}
执行结果
happy

相关文章:

move与函数指针的简单使用

std::move() C11的标准库 提供了一个非常有用的函数 std::move()&#xff0c;std::move() 函数将一个左值强制转化为右值引用&#xff0c;以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 #include <iostream&g…...

第五章 树与二叉树 二、二叉树的定义和常考考点

一、定义 二叉树可以用以下方式详细定义&#xff1a; 二叉树是由节点构成的树形结构&#xff0c;每个节点最多可以有两个子节点。每个节点有以下几个属性&#xff1a; 值&#xff1a;存储该节点的数据。左子节点&#xff1a;有一个左子节点&#xff0c;如果没有则为空。右子节…...

算法笔记/USACO Guide GOLD金组DP 1. Introduction to DP

USACO Guide中金组的内容分为一下六个章节 DP数学图论数据结构树一些附加主题 今天学习DP&#xff0c;以下内容&#xff1a; 初入DP背包DP图表中的路线最长递增序列状态压缩DP区间DP数位DP 初入DP Dynamic Programming (DP) is an important algorithmic technique in Comp…...

天锐绿盾安全U盘系统

安全U盘系统 01 简介 天锐绿盾安全U盘系统&#xff0c;是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等&#xff0c;天锐绿盾安全U盘系统为您U盘的数据保驾护航&#xff0…...

灰色预测模型

当谈论灰色预测时&#xff0c;通常是指灰色系统理论&#xff0c;它是一种用于处理少量数据或缺乏充分信息的情况下进行预测和分析的数学方法。灰色预测的核心思想是通过建立灰色模型来分析和预测数据的变化趋势。 我会解释灰色预测的基本原理、步骤和方法&#xff1a; 1. 灰色…...

Yolo系列-yolov1

YOLO-V1 经典的one-stage方法 YouOnlyLookOnce&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; Yolov1的核心思想是将对象…...

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下&#xff0c;如果电压继续增大&#xff0c;将会引发雪崩&#xff0c;使得…...

TCP协议的重点知识点

TCP协议的重点知识点 TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP基本特性 TCP主要具有以下基本特性: …...

大数据——一文熟悉HBase

1、HBase是什么 HBase是基于HDFS的数据存储&#xff0c;它建立在HDFS文件系统上面&#xff0c;利用了HDFS的容错能力&#xff0c;内部还有哈希表并利用索引&#xff0c;可以快速对HDFS上的数据进行随时读写功能。 Hadoop在已经有一个HiveMapReduce结构的数据读写功能&#x…...

如何有效进行RLHF的数据标注?

编者按&#xff1a;随着大语言模型在自然语言处理领域的广泛应用&#xff0c;如何从人类反馈进行强化学习&#xff08;RLHF&#xff09;已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注&#xff0c;这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…...

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

windows配置wsl,Unbuntu启动GPU加速

wsl全称Windows Subsystem for Linux&#xff0c;windows电脑下的linux子系统&#xff0c;对于想用Linux的Windows用户来说wsl是一个不错的选择。 安装wsl 两种方法可以安装wsl&#xff0c;这个默认安装在C盘。 方法一运行命令安装 wsl --install方法二&#xff0c;在windo…...

Postman测WebSocket接口

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…...

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…...

Unable to Locate package python2| Linux Ubuntu系统下python2的安装

Linux Ubuntu系统下python2的安装 FSL的安装脚本是用Python2写的&#xff0c;新版本的Ubuntu &#xff08;16以后&#xff09;在默认情况下没有安装Python2。在终端输入 python2&#xff0c;若提示没有相应的命令&#xff0c;则需要先安装Python2&#xff0c;如下指令&#xf…...

从上帝视角俯瞰vue2路由(简单易懂)

文章目录 路由原理&#xff08;hash&#xff09;路由安装和使用&#xff08;vue2&#xff09;路由跳转路由的传参和取值嵌套路由路由守卫完整代码 路由原理&#xff08;hash&#xff09; 单页应用的路由模式有两种 哈希模式&#xff08;利用hashchange 事件监听 url的hash 的…...

STL-空间配置器的了解

前言 空间配置器&#xff0c;顾名思义就是为了各个容器高效的管理空间&#xff08;空间的申请与回收&#xff09;的&#xff0c;在默默的工作的。虽然在常规上使用STL时&#xff0c;可能用不上它&#xff0c;但是站在学习研究的角度&#xff0c;学习它的实现原理对我们有很大的…...

哔哩哔哩 B站 bilibili 视频视频音效调节 清澈人声

视频音效调节方式&#xff1a;直接视频播放内容界面内鼠标右键点击视频音效调节 注意&#xff1a;需要使用的是谷歌浏览器&#xff0c;我的火狐浏览器试了不行&#xff0c;都没选项&#xff0c;火狐的出来的界面是这样的&#xff1a; 目录 具体操作如下&#xff1a; 1、谷歌…...

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构&#xff0c;它可以同时满足大数据存储和传统数据仓库的需求。具体来说&#xff0c;湖仓一体可以实现以下几个方面的功能&#xff1a; 数据集成&#xff1a; 湖仓一体可以集成多个数据源&#xff0c;包括结构…...

IntelliJ IDEA 2023.2.1 修复版本日志

我们刚刚发布了 v2023.2 的第一个错误修复更新。 您可以从 IDE 内部、使用工具箱应用程序或通过快照&#xff08;如果您使用的是 Ubuntu&#xff09;更新到此版本。您也可以直接从我们的网站下载。 以下是最新版本中包含的最值得注意的改进和修复的列表&#xff1a; 我们已经解…...

终极网盘直链下载助手完整指南:免费解锁八大平台高速下载

终极网盘直链下载助手完整指南&#xff1a;免费解锁八大平台高速下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

为个人开源项目寻找高性价比大模型API的选型与实践

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为个人开源项目寻找高性价比大模型API的选型与实践 对于个人开发者或学生而言&#xff0c;运营一个GitHub开源项目常常需要在有限的…...

别再只把JWT当登录凭证了!从CTFHub靶场看JWT在API安全与数据交换中的‘双刃剑’效应

JWT安全实战&#xff1a;从CTFHub靶场到企业级API防护的深度解析 在数字化身份认证领域&#xff0c;JSON Web Token&#xff08;JWT&#xff09;早已超越简单的登录凭证角色&#xff0c;成为现代分布式系统的核心组件。当开发者仅将其视为"带签名的Cookie"时&#xf…...

别再死磕外链了:用Python+搜索API实现Google SEO自动化内容生产

做Google SEO的人都有一个共同感受&#xff1a;越来越难了。 以前发发外链、堆堆锚文本就能上去&#xff0c;现在不行了。Google的算法从"匹配关键词"进化到了"匹配搜索意图"。外链权重从60%降到30%&#xff0c;内容质量成了核心排名因素。 但问题是&#…...

基于大语言模型的银行对账单自动化分析与财务预测实战

1. 项目概述&#xff1a;当大语言模型遇上个人财务分析最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“AI银行对账单文档自动化与个人财务分析预测”。光看这个标题&#xff0c;就能感觉到一股浓浓的“技术赋能生活”的味道。简单来说&#xff0c;这个项目想干的事儿&am…...

一图定胜负|虎贲等考 AI 科研绘图:零代码画出期刊级学术图,让论文颜值与专业度双在线

据 Nature 统计&#xff0c;超 90% 的审稿人先看图表&#xff0c;65% 的初审意见直接来自图表质量&#xff0c;一张规范、清晰、专业的学术图&#xff0c;直接影响论文录用与答辩评分。可现实是&#xff1a;Origin、Visio 难学难精通&#xff0c;PPT 做图粗糙不规范&#xff0c…...

软件需求捕获:从Therac-25悲剧到安全关键系统开发的脊柱工程

1. 项目概述&#xff1a;从Therac-25悲剧到现代软件安全基石上世纪90年代中期&#xff0c;一系列由Therac-25放射治疗机引发的致命事故&#xff0c;最终催生了一场由华盛顿大学Nancy Leveson教授主导的正式调查。这场调查的结论&#xff0c;远不止于揪出一款医疗设备的软件缺陷…...

MGRE实验报告

一.实验概述实验名称&#xff1a;MGRE实验实验目的&#xff1a;掌握 PPP 协议的 PAP/CHAP 认证与 HDLC 封装配置&#xff0c;理解不同广域网链路协议的工作机制与认证流程。实现 MGRE 环境&#xff08;R1 为 Hub&#xff09;与 GRE 环境的部署&#xff0c;理解点到多点 VPN 与点…...

数据中心机架内互连新范式:为何PCIe正取代以太网与InfiniBand?

1. 数据中心互连的十字路口&#xff1a;为什么是PCIe&#xff1f;在数据中心这个庞大而精密的数字世界里&#xff0c;服务器、存储和网络设备之间的“对话”效率&#xff0c;直接决定了整个系统的性能上限。过去十几年&#xff0c;我们习惯了用以太网&#xff08;Ethernet&…...

C#元组类型简介

元组是 C# 7.0 引入的轻量级数据结构&#xff0c;用于临时组合多个值&#xff0c;无需定义专门的类或结构。 元组是有序的数据结构&#xff0c;成员按声明/创建时的顺序排列。&#xff08;这里的元组只指值元组&#xff09;元组类型在C#7.0前是有一个专门的内置类型&#xff0c…...