跟我学c++高级篇——静态反射实现之一
一、非侵入式的静态反射(自省)
在前面分析过,反射有静态和动态两类形式,前者在编译期实现,后者在运行期实现。而针对c++这类天然不支持(或者说极弱支持)反射的语言,在实现上又可以分为侵入式和非侵入式实现。这个就更好理解了,侵入式需要在原代码上增加一些辅助代码,而非侵入式则不需要增加辅助代码。这个只要过一下脑子当然是后者好,但实际应用上到底哪种好,得看实际情况,不能一概而论。
二、利用宏实现静态反射
在前面的文章《C++中两个宏__PRETTY_FUNCTION__和__FUNCSIG__的应用》介绍过这两个宏(其实是一种宏),它可以对c++程序在编译期和运行期的问题所在有一个记录并反馈给开发者(也提到过使用这个宏可以实现一种编译期反射的方法)。但是不知道有没有读者注意到那篇文章的例程中运行结果的一些细节,它可以得到一些参数的类型。噢,这不就是反射想达到的一种目的么?那可不可以利用这个宏来实现一种反射的方式呢?答案是肯定的。先看一个简单的例子入手:
#include <iostream>
#ifdef _WIN64
#define __FUNC__ __FUNCSIG__
#else
#define __FUNC__ __PRETTY_FUNCTION__
#endiftemplate<typename T>
constexpr void Func()
{std::cout << __FUNC__ << std::endl;
}void getType() {Func<int>();
}
int main()
{getType();
}
它的运行结果是:
//gcc
constexpr void Func() [with T = int]
这是不是很明显可以看到T的类型是int,那么最暴力最原始的方法就是直接对这个字符串进行解析,然后得到T和int,这样不就可以得类型了么。看一下下面的例子:
#include <iostream>
#include <string>#ifdef _WIN64
#define __FUNC__ __FUNCSIG__
#else
#define __FUNC__ __PRETTY_FUNCTION__
#endifstd::string_view parseResult(std::string result) {//str = constexpr void Func() [with T = int]auto begin = result.find("T = ") + 4;auto end = result.find_last_of("]");return std::string_view{ result.data() + begin, end - begin };
}
template<typename T>
constexpr auto TypeInfo() {auto result = __FUNC__;return parseResult(result);
}class Example{int d = 0;void GetData(){std::cout<<"test"<<std::endl;}
};int main()
{auto type = TypeInfo<Example>();std::cout<<type<<std::endl;type = TypeInfo<int>();std::cout<<type<<std::endl;type = TypeInfo<double>();std::cout<<type<<std::endl;}
运行结果:
Example
int
double
当然针对不同的编译器和平台可能还会需要进行细节上的修改,但整体上的原则基本是相同的。
三、例程
下面再看一个针对枚举体的例程。枚举体是一种比较特殊的情况,它可以和整数隐式转换。C++11又推出了枚举类,看看下面的例子:
#include <iostream>
#include <string>#ifdef _WIN64
#define __FUNC__ __FUNCSIG__
#else
#define __FUNC__ __PRETTY_FUNCTION__
#endifenum class DataType{USB,PCI,HD};
enum DType{USB,PCI,HD};template<auto T>
constexpr auto TypeInfo()
{std::string type = __FUNC__;auto begin = type.find("T = ") + 4;auto end = type.find_last_of(']');return std::string_view{ type.data() + begin, end - begin };
}int main()
{std::cout<<Func1<DataType::HD>()<<std::endl;std::cout<<Func1<DType::HD>()<<std::endl;
}
运行结果:
DataType::HD
HD
今天把使用宏__PRETTY_FUNCTION__来实现静态非侵入式的反射进行了一个初步的分析说明,然后下一步将继续分析枚举的反射,从此处打开一个缺口,让大家更好的明白反射的实现方式的一个切入点。
四、总结
反射写起来非常头痛,一个是不知道如何说起更有系统性;另外一个就是哪种反射更有利于实际的应用。所以反射这个系列可能会是一个很长期的总结过程,大家不要着急,一定会把坑慢慢填好。
相关文章:
跟我学c++高级篇——静态反射实现之一
一、非侵入式的静态反射(自省) 在前面分析过,反射有静态和动态两类形式,前者在编译期实现,后者在运行期实现。而针对c这类天然不支持(或者说极弱支持)反射的语言,在实现上又可以分为…...
人工智能|机器学习——循环神经网络的简洁实现
循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…...
02_MySQL体系结构及数据文件介绍
#课程目标 了解MySQL的体系结构了解MySQL常见的日志文件及作用了解事务的控制语句,提交和回滚能够查看当前数据库的版本和用户了解MySQL数据库如何存放数据能在使用SQL语句创建、删除数据库 #一、MySQL的体系结构 ##1、客户端(连接者) MySQL的客户端可以是某个客户…...
【Web安全】xsstrike工具使用方法表格
xsstrike工具使用方法表格 版本:XSStrike v3.1.5 项目地址: https://github.com/s0md3v/XSStrike使用文档: usage: xsstrike.py [-h] [-u TARGET] [--data PARAMDATA] [-e ENCODE] [--fuzzer] [--update] [--timeout TIMEOUT] [--proxy][…...
python实现鼠标实时坐标监测
python实现鼠标实时坐标监测 一、说明 使用了以下技术和库: tkinter:用于创建GUI界面。pyperclip:用于复制文本到剪贴板。pynput.mouse:用于监听鼠标事件,包括移动和点击。threading:用于创建多线程&…...
【华为OD】C卷真题 100%通过:攀登者1 C/C++源码实现
【华为OD】C卷真题 100%通过:攀登者1 C/C源码实现 目录 题目描述: 示例1 代码实现: 题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置&…...
Flask,uWSGI,nginx的理解
文章目录 前言与背景理解 - FlaskuWSGInginx理解 - nginx理解 - FlaskuWSGI理解 - vuedjangonginx 前言与背景 此篇文章是针对小白的一篇理解Flask,uWSGI,nginx的文章,只介绍了理解,并没有介绍如何部署。 由于工作需要使用flask…...
【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)
🌈个人主页: Aileen_0v0🔥系列专栏:Java学习系列专栏💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 私有成员变量在继承中的使用编辑 当子类和父类变量不重名时: 当子类和父类重名时: 📝总结: 继承的含义: …...
单细胞seurat入门—— 从原始数据到表达矩阵
根据所使用的建库方法,单细胞的RNA序列(也称为读取(reads)或标签(tags))将从转录本的3端(或5端)(10X Genomics,CEL-seq2,Drop-seq&…...
Docker部署Nacos
此篇文章使用的nacos为2.2.1版本 拉取Nacos镜像 docker pull nacos/nacos-server:v2.2.1先将容器启动起来 docker run -d \ --name nacos \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ --privilegedtrue \ -e JVM_XMS256m \ -e JVM_XMX256m \ -e MODEstandalone \ -e NA…...
1005. K 次取反后最大化的数组和
原题链接:1005. K 次取反后最大化的数组和 思路: 先把数组排序好,然后直接从下标0(最小的负数)开始反转,那么接下来有两种情况: 1.负数反转完了,k还有剩余。此时因为nums内全部都是正数,所以我…...
【云原生】什么是 Kubernetes ?
什么是 Kubernetes ? Kubernetes 是一个开源容器编排平台,管理着一系列的 主机 或者 服务器,它们被称作是 节点(Node)。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…...
自建CA实战之 《0x01 Nginx 配置 https单向认证》
自建私有化证书颁发机构(Certificate Authority,CA)实战之 《0x01 Nginx 配置 https单向认证》 上一篇文章我们介绍了如何自建私有化证书颁发机构(Certificate Authority,CA),本篇文章我们将介…...
《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面
QWidget实现了log日志的打印功能,不仅可以在界面显示,还可以生成打印日志。先来看下效果,源码放在文章末尾: LogPlugin插件类管理log所有功能,它可以获取Log界面并能打印正常信息,警告信息和错误信息&…...
JVM的小知识总结
加载时jvm做了这三件事: 1)通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名? 就是类名全称,带包路径的用点隔开,例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名,就…...
深入理解JVM虚拟机第二十六篇:详解JVM当中的虚方法和非虚方法,并从字节码指令的角度去分析虚方法和非虚方法
😉😉 学习交流群: ✅✅1:这是孙哥suns和树哥给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824 📚📚 微信:DashuDeveloper拉你进微信群,免费领取! 一:非虚方法和虚方法 方法…...
ElasticSearch的日志配置
ElasticSearch默认情况下使用Log4j2来记录日志,日志配置文件的路径为$ES_HOME/config/log4j2.properties,配置方法见Log4j2的官方文档。 参考path-settings,通过指定path.logs,可以指定日志文件的保存路径。 在日志配置文件$ES_…...
SQL Injection (Blind)`
SQL Injection (Blind) SQL Injection (Blind) SQL盲注,是一种特殊类型的SQL注入攻击,它的特点是无法直接从页面上看到注入语句的执行结果。在这种情况下,需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 盲注的主要形式有…...
NX二次开发UF_CURVE_ask_trim 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_trim Defined in: uf_curve.h int UF_CURVE_ask_trim(tag_t trim_feature, UF_CURVE_trim_p_t trim_info ) overview 概述 Retrieve the current parameters of an a…...
linux的netstat命令和ss命令
1. 网络状态 State状态LISTENING监听中,服务端需要打开一个socket进行监听,侦听来自远方TCP端口的连接请求ESTABLISHED已连接,代表一个打开的连接,双方可以进行或已经在数据交互了SYN_SENT客户端通过应用程序调用connect发送一个…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
