C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

news2024/11/27 12:32:43

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。
其教学视频见:[C++高级教程]从零开始开发服务器框架(sylar)

上一篇:C++服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase结构

C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

  • 目前进度
  • 关系梳理
  • std::function学习
  • std::get学习

目前进度

学习完第5个视频。下一节是编译调试,我也会在下篇文章把这1~9的所有代码给出。
要点:

  1. log.h中,LogAppender的log函数加了一个指针logger,目的是为了把log的名字传进去,因为在formatter中有输出日志名称的功能;Logger加了一个函数getName(),这个函数就是为了LogAppender加的那个指针logger能够调用这个函数来获取到日志名称。
    在这里插入图片描述

  2. 相应的,对LogAppender的子类StdoutLogAppender和FileLogAppender的函数log做修改,对LogFormatter::format也对应做修改,下图是log.cc中的修改。但实际在log.h中也要做给这几个类的函数的形式参数做相应修改(该up可能忘记了)
    在这里插入图片描述

  3. 在log.cc中,实现各个FormatItem的子类,并将它们的位置改放到了logger::ToString函数的下方。其中的第2个ElapseFormatItem是写错了,应该是NameFormatItem。
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  4. 在log.h中给FormatItem加了一个带参数的构造函数。
    在这里插入图片描述

  5. 在log.cc中的LogFormatter::init后面加上如下的264~293行的内容。之前C++服务器框架开发7中的vec存入了LogFormater::m_pattern中的所有要解析的内容,然后现在要调用各个Item子类对象来格式化,并将内容存入LogMatter::m_items中。
    在这里插入图片描述

关系梳理

目前在logger中实现的类有logger、LogAppender、LogFormatter,及它们的子类。比较复杂的是各种log和format函数,所以有必要梳理一下它们的关系。
它们各自的成员,大致的调用关系如下图:
在这里插入图片描述

std::function学习

要点5中出现了std::function,学习下它。参考字文章1。
std::function是函数包装器,可包装任何类型的可调用实体,包含在头文件<functional>中。
例子:std::function包装lamda表达式

#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include<iostream>
#include<functional>


#endif 

std::function<int(int)> callback;
int main() {
	std::cout << "Hello world" << std::endl;

	auto fun3 = [](int a) {return a * 2; }; //lamda表达式
	callback = fun3; //std::function包装lamda表达式
	std::cout << callback(9) << std::endl; //std::function对象实例调用包装的调用实体

	return 0;
}

在这里插入图片描述

std::get学习

要点5中,用这个读取vec里面的std::tuple。
参考自文章2。

  1. 在之前的文章C++11 std::tuple 中有使用std::get获取std::tuple元素的例子。
  2. std::get除了通过索引(C++11)获取std::tuple的元素,还能通过元素类型获取元素
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include<iostream>
#include<tuple>
#include<string>

#endif 

int main()
{
	std::tuple<int, int> t1{ 1, 1 };
	std::cout << "t1 is {" << std::get<0>(t1) << ", " << std::get<1>(t1) << "}" << std::endl;

	std::tuple<int, std::string> t2{ 1, "hello world" };
	std::cout << "t2 is {" << std::get<int>(t2) << ", " << std::get<std::string>(t2) << "}" << std::endl;

	std::tuple<int, int> t3{ 1, 1 };
	// error: static_assert failed due to requirement 'value != __ambiguous' 
	// "type occurs more than once in type list"
	// std::cout << "t3 is {" << std::get<int>(t3);
	return 0;
}

在这里插入图片描述

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

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

相关文章

3-10 0-1背包问题

1.什么是0-1背包问题 0-1背包问题是动态规划中的一个经典问题&#xff0c;其目标是在给定背包容量和一组物品的重量和价值的情况下&#xff0c;选择一些物品放入背包中&#xff0c;使得放入的物品总重量不超过背包容量&#xff0c;并且使得放入的物品总价值最大化。 问题的输…

低代码平台实力盘点:2023年最具实力的低代码平台排行榜

低代码平台是近年来迅猛发展的技术之一。它通过用最少量的编程代码去开发应用程序&#xff0c;从而提高效率。由此&#xff0c;许多企业都在使用低代码平台进行业务的开发和升级。低代码平台可以大幅简化编码过程&#xff0c;并且可以快速构建定制化的应用程序&#xff0c;从而…

GC 调优(工具篇)

进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具。 JVM 在程序执行的过程中, 提供了GC行为的原生数据。那么, 我们就可以利用这些原生数据来生成各种报告。原生数据(raw data) 包括: 各个内存池…

1. 卷积的基本结构

一、卷积神经网络的结构有哪些&#xff1f; 一般包含5种类型的网络层次结构&#xff1a; 输入层&#xff1a;卷积网络的原始输入&#xff0c;可以是原始或预处理后的像素矩阵 卷积层 &#xff1a;参数共享、局部连接&#xff0c;利用平移不变性从全局特征图提取局部特征 激活层…

路径规划算法:基于原子搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于原子搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于原子搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

java并发编程:java内存模型介绍

文章目录 并发编程模型的两个关键问题物理计算机的内存模型缓存不一致的问题总线加LOCK#锁的方式缓存一致性协议 Java内存模型 并发编程模型的两个关键问题 线程间如何通信&#xff1f;即&#xff1a;线程之间以何种机制来交换信息 线程间如何同步&#xff1f;即&#xff1a;…

JavaEE-Servlet(CookieSession)

目录 CookieCookie从哪里来&#xff1f;Cookie到哪里去&#xff1f;Cookie有啥用&#xff1f; SessionServlet中操作 Cookie 和 Session 的APIHttpServletRequest小案例&#xff1a;模拟实现登录功能 HttpServletResponseHttpSessionCookie 类中的相关方法小案例&#xff1a;上…

【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时&#xff0c;安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程&#xff1a; 访问官方网站&#xff1a;打开浏览器&#xff0c;访问.NET Core的官方网站&#xff1a;https://dotnet.microsoft.com/en-u…

【vue】三:核心处理---vue的生命周期

文章目录 1.Vue生命周期的四个阶段&#xff0c;八个钩子2.vue的生命周期图例3. 初始阶段&#xff1a;虚拟DOM生成4. 挂载阶段&#xff1a;真实DOM生成5. 更新阶段&#xff1a;data变化重新渲染6. 销毁阶段&#xff1a;卸载所有&#xff0c;销毁vm 1.Vue生命周期的四个阶段&…

Python+Django人脸识别考勤系统网站

程序示例精选 PythonDjango人脸识别考勤系统网站 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonDjango人脸识别考勤系统网站>>编写代码&#xff0c;代码整洁&#xff0c…

文本分类系统Python,基于深度学习CNN卷积神经网络

一、介绍 文本分类系统&#xff0c;使用Python作为主要开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练&#xff0c;最后得到一个h5格式的本地模型文件&#xff0c;然后采用Django开发网页界面&#xff0c;实现用户在界面中输入一…

I.MX6ull 按键抖动消除

1 按键消抖的原理 其实就是在按键按下以后延时一段时间再 去读取按键值&#xff0c;如果此时按键值还有效那就表示这是一次有效的按键&#xff0c;中间的延时就是消抖的。 延时函数实现 会浪费 CPU 性能&#xff0c;因为延时函数就是空跑。 我们可以借助定时器来实现消抖&…

小程序服务器SSL证书替换,访问小程序异常

小程序最近SSL证书过期&#xff0c;访问小程序errno: 600001, errMsg: “request:fail -102:net::ERR_CONNECTION_REFUSED“。 1.在阿里云申请DV证书&#xff0c; DV证书&#xff1a;域名验证型证书&#xff0c;证书审核方式为通过验证域名所有权即可签发证书。 DV证书只验证…

基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

从本篇博客正式开始深度学习项目的记录&#xff0c;实例代码只会放通用的代码&#xff0c;数据集和训练数据也是不会全部放出。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集原图获取与标注 基于Yolov5目标检测的物体分类…

【计算机组成原理与体系结构】硬件系统概述

目录 一、计算机的发展 二、计算机的硬件系统 三、硬件的工作原理 四、计算机系统的层次结构 五、计算机的性能指标 一、计算机的发展 第一代计算机&#xff1a;电子管计算机 第一台电子计算机&#xff1a;ENIAC&#xff08;1946&#xff09; 设计目的&#xff1a;计算导弹…

实验篇(7.2) 06. 通过安全隧道访问远端内网服务器 (SSL) ❀ 远程访问

【简介】直接映射服务器到公网&#xff0c;没有验证不安全&#xff1b;通过Web浏览器访问远程内网服务器&#xff0c;有验证也安全&#xff0c;但是支持的协议太少。那有没有即安全&#xff0c;又能支持所有协议的访问方法呢&#xff1f;我们来看看SSL VPN的隧道模式。 实验要求…

基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换

刚开始跟着网上的教程做&#xff0c;把环境安装错了&#xff0c;后来直接用GitHub的官方教程来安装环境。 地址是yolov5官方团队代码及教程&#xff0c;看readme文件就可以。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集…

【MySQL】一文带你了解表的增删改查 CRUD

文章目录 1. 增加&#xff08;Create&#xff09;1.1 单行插入 全列插入1.2 多行插入 指定列插入 2. 查询&#xff08;Retrieve&#xff09;2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重2.6 排序 3. 条件查询&#xff08;Where&#xff09;3.1比较运算符…

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示 上一章Bayesian Networks本章&#xff1a;观测学习学习学习元素机器学习概论机器学习对什么有用自动语音识别计算机视觉Information retrieval—信息检索 机器学习机器学习&#xff1a;定义 电子邮件过滤问题…

全志V3S嵌入式驱动开发(gpio输出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是对mcu&#xff0c;还是对soc来说&#xff0c;gpio肯定是越多越好。但是一个芯片上&#xff0c;它的引脚总是有限的&#xff0c;特别对于非BG…