摘要
对于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的配置,因此返回的类型列表可能会有所不同。然而,以下是一些常见的类型及其对应的类型名称:
int
:返回 "i" 或 "int"。float
:返回 "f" 或 "float"。double
:返回 "d" 或 "double"。char
:返回 "c" 或 "char"。bool
:返回 "b" 或 "bool"。void
:返回 "v" 或 "void"。- 自定义类类型(例如 MyClass):返回类的完全限定名,例如 "MyClass" 或包含命名空间的名称(例如 "MyNamespace::MyClass")。
需要注意的是,这些类型名称可能因编译器和Qt版本的不同而有所差异。有些编译器可能会返回经过修饰的类型名称,包含了额外的信息,如编译器特定的类型信息或模板参数等。