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

2023-12-11 04:04

本文主要是介绍C++之获取变量信息名称、类型typeid,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要

对于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);//QStringQString name;printf("--------QString-----------\n");printVariableInfo(name, varName(name));//intint myVariable = 42;printf("--------int-----------\n");printVariableInfo(myVariable, varName(myVariable));//class AA c;printf("--------class A-----------\n");printVariableInfo(c, varName(c));//typedef intword d;printf("--------typedef int-----------\n");printVariableInfo(d, varName(d));//doubledouble h;printf("--------double-----------\n");printVariableInfo(h, varName(h));//struct bsjsh1bsjsh1 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版本的不同而有所差异。有些编译器可能会返回经过修饰的类型名称,包含了额外的信息,如编译器特定的类型信息或模板参数等。

这篇关于C++之获取变量信息名称、类型typeid的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479398

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑