How can I get the class name from a C++ object?(如何从 C++ 对象中获取类名?)
问题描述
是否也可以获取对象名称?
Is it possible to get the object name too?
#include<cstdio>
class one {
public:
int no_of_students;
one() { no_of_students = 0; }
void new_admission() { no_of_students++; }
};
int main() {
one A;
for(int i = 0; i < 99; i++) {
A.new_admission();
}
cout<<"class"<<[classname]<<" "<<[objectname]<<"has "
<<A.no_of_students<<" students";
}
我可以在哪里获取名字,比如
where I can fetch the names, something like
[classname] = A.classname() = one
[objectname] = A.objectname() = A
C++ 是否提供任何机制来实现这一点?
推荐答案
您可以使用预处理器来显示变量的名称.例如
You can display the name of a variable by using the preprocessor. For instance
#include <iostream>
#define quote(x) #x
class one {};
int main(){
one A;
std::cout<<typeid(A).name()<<" "<< quote(A) <<"
";
return 0;
}
输出
3one A
在我的机器上.#
将一个token变成一个字符串,经过预处理后的行是
on my machine. The #
changes a token into a string, after preprocessing the line is
std::cout<<typeid(A).name()<<" "<< "A" <<"
";
当然如果你做类似的事情
Of course if you do something like
void foo(one B){
std::cout<<typeid(B).name()<<" "<< quote(B) <<"
";
}
int main(){
one A;
foo(A);
return 0;
}
你会得到
3one B
因为编译器不会跟踪所有变量的名称.
as the compiler doesn't keep track of all of the variable's names.
在 gcc 中,typeid().name() 的结果是经过修改的类名,以获得 破解版 使用
As it happens in gcc the result of typeid().name() is the mangled class name, to get the demangled version use
#include <iostream>
#include <cxxabi.h>
#define quote(x) #x
template <typename foo,typename bar> class one{ };
int main(){
one<int,one<double, int> > A;
int status;
char * demangled = abi::__cxa_demangle(typeid(A).name(),0,0,&status);
std::cout<<demangled<<" "<< quote(A) <<"
";
free(demangled);
return 0;
}
这给了我
one<int, one<double, int> > A
其他编译器可能使用不同的命名方案.
Other compilers may use different naming schemes.
这篇关于如何从 C++ 对象中获取类名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何从 C++ 对象中获取类名?
基础教程推荐
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01