当前位置: 首页 > 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; 我们已经解…...

从‘水变油’到‘大师一问三不知’:求实学风如何塑造科学巨匠与避免历史弯路

1. 科学史上的两副面孔&#xff1a;浮夸与求实 1993年&#xff0c;一场名为"水变油"的闹剧在国内掀起轩然大波。某"发明家"声称发明了能将水转化为燃料的"神奇添加剂"&#xff0c;甚至获得了部分政府部门的支持。这个明显违背能量守恒定律的&quo…...

Windows ❀ 高效端口检测工具tcping的安装与实战技巧

1. 为什么你需要tcping这个神器&#xff1f; 做运维的朋友应该都遇到过这种情况&#xff1a;服务器明明能ping通&#xff0c;但服务就是访问不了。这时候传统的ping命令就束手无策了&#xff0c;因为它只能检测网络层是否连通&#xff0c;而无法判断具体端口是否开放。这就是tc…...

从硬件迷宫到macOS殿堂:OpCore Simplify如何重塑黑苹果配置体验

从硬件迷宫到macOS殿堂&#xff1a;OpCore Simplify如何重塑黑苹果配置体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于许多技术爱好者来说&a…...

Visual Studio 2019安装Python组件失败?教你手动定位installer目录完成安装

Visual Studio 2019安装Python组件失败的终极解决方案 当你在Visual Studio 2019中尝试安装Python组件时&#xff0c;突然遇到"安装程序不完整"的错误提示&#xff0c;这确实令人沮丧。作为一名长期使用VS进行Python开发的工程师&#xff0c;我完全理解这种中断对工作…...

RustDesk 中继服务器搭建指南:告别卡顿,实现高效远程控制

1. 为什么你需要自建RustDesk中继服务器 远程办公已经成为现代工作方式的标配&#xff0c;但很多人在使用公共远程控制服务时都遇到过令人抓狂的卡顿问题。想象一下&#xff0c;你正在紧急处理服务器故障&#xff0c;画面却卡成了PPT&#xff1b;或者需要远程协助家人修电脑&a…...

从教程到实战:在快马平台部署企业级openclaw数据采集与监控系统

今天想和大家分享一个实战经验&#xff1a;如何把openclaw这个数据采集工具从教程变成真正的企业级应用。最近我在InsCode(快马)平台上完整走通了从开发到部署的全流程&#xff0c;整个过程比想象中顺畅很多。 任务调度器的实现 首先需要解决的是任务调度问题。传统教程里可能…...

终极Windows 11优化指南:一键清理系统臃肿,让电脑速度翻倍

终极Windows 11优化指南&#xff1a;一键清理系统臃肿&#xff0c;让电脑速度翻倍 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其…...

LibreHardwareMonitor:5分钟掌握免费开源硬件监控的终极指南

LibreHardwareMonitor&#xff1a;5分钟掌握免费开源硬件监控的终极指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor, home of the fork of Open Hardware Monitor 项目地址: https://gitcode.com/GitHub_Trending/li/LibreHardwareMonitor 想要实时…...

AI智能体工作完整源码大公开!企业级多Agent框架,一键私有化部署

温馨提示&#xff1a;文末有资源获取方式最近“龙虾AI”的热度席卷技术圈&#xff0c;大家都在讨论如何“养殖”自己的智能体。但真正落地时&#xff0c;技术门槛、Token消耗与复杂的协同问题&#xff0c;往往让普通用户和企业望而却步。今天我们不谈概念&#xff0c;直接分享一…...

Qwen3-32B-Chat API优化:降低OpenClaw任务Token消耗的5个技巧

Qwen3-32B-Chat API优化&#xff1a;降低OpenClaw任务Token消耗的5个技巧 1. 为什么需要关注Token消耗&#xff1f; 当我第一次在本地部署OpenClaw对接Qwen3-32B-Chat模型时&#xff0c;最让我震惊的不是它的推理能力&#xff0c;而是执行简单自动化任务后Token消耗的速度。一…...