C++之获取变量信息名称、类型typeid

news2024/11/14 20:03:39

摘要

对于C++工程量级比较庞大的代码,代码中的变量、类、函数、结构体的识别都是一件让人头疼的事情,一方面代码越写越多,内容越来越丰富,但是没有办法对已有的代码框架进行高度的整合提炼;另一方面对新人逐渐不友好,增加了学习成本。那么如何获取一些类别信息并进行统筹管理呢?

一、typeid

在C++中,typeid是一个用于获取对象类型的运算符。它可以在运行时获取对象的类型信息,包括类名和类型转换。typeid运算符通常与动态类型识别(RTTI)一起使用。RTTI是一种在运行时获取类型信息的技术,它允许程序在运行时检查对象的类型并执行相应的操作。

二、技巧

1.变量名称获得


#include <string>

#define varName(x) #x  //宏定义获取字符信息


int main(int argc, char *argv[])
{
    int adsadf;
    string name1 = varName(myVariable);
    
}

2.类型获得

#include <iostream>


int main(int argc, char *argv[])
{
    int adsadf;
    std::cout << "Variable name: " << typeid(adsadf).name() << std::endl;
    
}

三、试验

我们做项目时可以考虑进行一定的函数封装。代码中printVariableInfo就是对任意的输入类型进行判断。

#include <QCoreApplication>
#include<QString>
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
typedef int word;
class A {};
struct bsjsh {
    int aa;
};
struct bsjsh1 {
    int aa;
};
void help(int k) {
    string s1 = "", s2;
}

#define varName(x) #x
template <typename T>
void printVariableInfo(const T& variable,string s) { //封装T模版函数
    std::cout << "Variable type: " << s << std::endl;
    std::cout << "Variable type: " << typeid(T).name() << std::endl;
}
void myFunction() {
    std::cout << "Function name: " << __func__ << std::endl;//自带识别__func__
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //QString
    QString name;
    printf("--------QString-----------\n");
    printVariableInfo(name, varName(name));

    //int
    int myVariable = 42;
    printf("--------int-----------\n");
    printVariableInfo(myVariable, varName(myVariable));

    //class A
    A c;
    printf("--------class A-----------\n");
    printVariableInfo(c, varName(c));

    //typedef int
    word d;
    printf("--------typedef int-----------\n");
    printVariableInfo(d, varName(d));

    //double
    double h;
    printf("--------double-----------\n");
    printVariableInfo(h, varName(h));

    //struct bsjsh1
    bsjsh1 adffgsgf;
    printf("--------struct bsjsh1-----------\n");
    printVariableInfo(adffgsgf, varName(adffgsgf));

    //函数自带的识别函数__func__
    myFunction();


    return a.exec();
}

四、结果

可以看出对于一些类型识别是有对应的关键词进行索引的,但对于一些自定义类型识别的类型前面会有数字,主要是编译器为了识别添加的,因此对于识别的类型还需要一些与场景应用相关的文字处理的方式才可以对其进行筛序。

通过查找QT文档,typeid(T).name()方法返回一个表示类型名称的C字符串。这个字符串取决于编译器和Qt的配置,因此返回的类型列表可能会有所不同。然而,以下是一些常见的类型及其对应的类型名称:

  1. int:返回 "i" 或 "int"。
  2. float:返回 "f" 或 "float"。
  3. double:返回 "d" 或 "double"。
  4. char:返回 "c" 或 "char"。
  5. bool:返回 "b" 或 "bool"。
  6. void:返回 "v" 或 "void"。
  7. 自定义类类型(例如 MyClass):返回类的完全限定名,例如 "MyClass" 或包含命名空间的名称(例如 "MyNamespace::MyClass")。

需要注意的是,这些类型名称可能因编译器和Qt版本的不同而有所差异。有些编译器可能会返回经过修饰的类型名称,包含了额外的信息,如编译器特定的类型信息或模板参数等。

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

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

相关文章

python 协程

python 协程 协程为什么需要协程&#xff1f;协程与子线程的区别协程的工作原理协程的优缺点协程优点协程缺点 协程的实现yield 关键字greenlet 模块gevent 模块Pool 限制并发 协程 协程又称微线程&#xff0c;英文名coroutine。协程是用户态的一种轻量级线程&#xff0c;是由…

Visual Studio开发环境的搭建

1.引言 Visual Studio是微软公司开发的一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员进行各种编程任务&#xff0c;包括设计、开发、测试、调试和部署应用程序。典型功能包括&#xff1a; 代码编辑器。提供高效、智能的代码编辑器&#x…

一文读懂FastAPI:Python 开发者的福音

FastAPI是一个基于Python的现代化Web框架&#xff0c;它提供了快速、简单和高性能的方式来构建API。 它结合了Python的静态类型检查和自动化文档生成的功能&#xff0c;使得开发API变得更加容易和高效。 下面将介绍如何使用FastAPI快速开发接口&#xff0c;并且利用自动生成的…

Red Hat Satellite - 为主机配置可使用的内容(存储库),注册主机并安装软件包

《OpenShift / RHEL / DevSecOps 汇总目录》 请先根据《Red Hat Satellite - 导入订阅清单》一文完成向 Red Hat Satellite 导入分配的订阅订单。 本文中的相关概念请参见《Red Hat Satellite - 核心概念篇》。 文章目录 配置 Repository 并同步配置生命周期的环境路径配置内容…

死锁的概念

死锁&#xff08;Deadlock&#xff09;、饥饿&#xff08;Starvation&#xff09;和死循环&#xff08;Infinite Loop&#xff09;是计算机科学中与并发和并行处理相关的三个概念&#xff0c;它们描述了不同类型的问题和情况。 死锁&#xff08;Deadlock&#xff09;: 定义: 死…

优先考虑静态成员类

在Java中&#xff0c;静态成员类&#xff08;static nested class&#xff09;是一种嵌套在另一个类中的类&#xff0c;且被声明为静态。静态成员类不依赖于外部类的实例&#xff0c;可以直接通过外部类的类名来访问。 优先考虑使用静态成员类的情况通常是当这个类与外部类的实…

IC卡卡号修改UID卡CUID卡物理卡号修改考勤工号修改

普通M1卡的物理卡号是锁死的&#xff0c;UID卡、CUID卡、FUID卡是特殊的M1卡&#xff0c;他们的物理卡号是可以修改的。考勤卡、门禁等读取到的IC卡卡号是这样的0136098153&#xff0c;10位卡号&#xff0c;这个卡号是随机的&#xff0c;不连续的&#xff0c;没有规律&#xff…

纯干货|聊一聊大促活动背后的技术:火山引擎边缘云CDN/DCDN/GA

12月12日&#xff0c;“抖音商城双12好物节”正式结束。据了解&#xff0c;双12期间&#xff0c;抖音电商推出了超值购、秒杀等多个优价频道和多个类目的主题榜单&#xff0c;让有消费需求的用户更高效地发现高性价比好物。除了货架场景&#xff0c;“抖音商城双12好物节”还发…

基于ssm校园资讯推荐系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园资讯推荐系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

31、应急响应——Windows

文章目录 一、账户排查1.1 登录服务器的途径1.2 弱口令1.3 可疑账号 二、网络排查三、进程排查四、注册表排查五、内存分析 一、账户排查 1.1 登录服务器的途径 3389smb 445httpftp数据库中间件 1.2 弱口令 弱口令途径&#xff1a;3389、smb 445、http、ftp、数据库、中间件…

C# 如何控制多线程同步执行

写在前面 使用Task类来控制多线程的同步执行&#xff0c;可应用于多任务分发执行后&#xff0c;再做归并处理。Tas既拥有线程池的优点&#xff0c;同时也解决了使用ThreadPool不易控制的弊端&#xff1b;可以非常简便并可靠地实现多线程的顺序执行。 代码实现 public class …

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

宏基因组学中如何计算分箱结果bins(基因组)的丰度?

1、基于metawrap环境计算bin丰度(推荐) MetaWRAp&#xff08;Metagenomic Workflow for Assembly, binning, and annotation&#xff09;是一个用于处理宏基因组学数据的工具&#xff0c;包括元组装、分箱&#xff08;binning&#xff09;、基因组注释等功能。要基于 MetaWRAp …

Python:五种算法RFO、GWO、DBO、HHO、SSA求解23个测试函数

一、五种算法介绍 &#xff08;1&#xff09;红狐优化算法&#xff08;Red fox optimization&#xff0c;RFO&#xff09; &#xff08;2&#xff09;灰狼优化算法(Grey Wolf Optimizer&#xff0c;GWO) &#xff08;3&#xff09;蜣螂优化算法&#xff08;Dung beetle opti…

maui 开发音乐播放APP 优化 用fastapi_amis_admin创建后台及接口(5)

相关的models from datetime import datetime from typing import List, Optional import sqlmodel from fastapi_amis_admin.amis.components import ColumnImage, InputImage, InputRichText from fastapi_amis_admin.models.enums import IntegerChoices from fastapi_amis…

VSCode 配置自动生成头文件

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader VSCode 配置自动生成头文件 一、snippets二、配置步骤三、效果展示 一、snippets 相信大家对C、C都头文件都不陌生&#xff0c;都会发现每个头文件都会包括下面的这些格式&…

引迈信息-JNPF平台怎么样?值得入手吗?

目录 1.前言 2.引迈低代码怎么样&#xff1f; 3.平台亮点展示 4.引迈产品特点 5.引迈产品技术栈&#xff1a; 1.前言 低代码是近几年比较火的一种应用程序快速开发方式&#xff0c;它能帮助用户在开发软件的过程中大幅减少手工编码量&#xff0c;并通过可视化组件加速应用…

【基于卷积神经网络的疲劳检测与预警系统的设计与实现】

基于卷积神经网络的疲劳检测与预警系统的设计与实现 引言数据集介绍技术与工具1. OpenCV2. TensorFlow3. 卷积神经网络&#xff08;CNN&#xff09; 系统功能模块1. 视频采集模块2. 图像预处理模块3. 人脸识别模块4. 疲劳程度判别模块5. 报警模块 系统设计创新点1. 实时监测与预…

GAN的原理分析与实例

为了便于理解&#xff0c;可以先玩一玩这个网站&#xff1a;GAN Lab: Play with Generative Adversarial Networks in Your Browser! GAN的本质&#xff1a;枯叶蝶和鸟。生成器的目标&#xff1a;让枯叶蝶进化&#xff0c;变得像枯叶&#xff0c;不被鸟准确识别。判别器的目标&…

Spring Boot之自定义starter

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Boot的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. starter是什么 二.为什么要使…