`

C++ 获取变量名称 & 获取类型的名称

    博客分类:
  • C++
c++ 
阅读更多
1、获取变量名称
采用如下宏定义即可,这个宏定义将表达式x直接转换为对应的字符串:
#define  varName(x) #x
#define  printExp(exp) cout<<#exp<<"为:\t\t"<<(exp)<<endl  //这样就方便调试了,不用一个个的写变量名称了


用法:
cout<<varName(aInt)<<endl; \\输出为:  aInt


2、获取类型名称
采用如下宏定义即可,这个宏定义将表达式x直接转换为对应的字符串:
//可能需要#include <typeinfo>  好像不引用也成
cout<<typeid(int).name()<<endl;

更多的用法见最后的程序;
先看一下输出:


3、参考的网址
1、http://www.cplusplus.com/reference/typeinfo/type_info/
2、http://bbs.csdn.net/topics/380019977

4、完整的程序:
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

#define  varName(x) #x
#define  printExp(exp) cout<<#exp<<"为:\t\t"<<(exp)<<endl
#define  printExpToString(exp) cout<<(string(#exp)+"为:\t\t") <<(exp).toString()<<endl  //注意exp加个括号更安全

namespace LC {
template<typename T> class Base {
public:
   virtual  string toString() {
        stringstream ss;
        ss<<typeid(*this).name();
        return ss.str();
    }

     Base operator+ (int a){
		 return *this;
	}
};

template<typename T> class Derived:public Base<T> {
public:
      virtual string toString() {
        stringstream ss;
        ss<<typeid(*this).name();
        return ss.str();
    }
};
}

typedef LC::Base<double> BaseDouble;

typedef LC::Derived<int> DerivedInt;

void main() {
	int aInt=1;
	printExp(aInt);  
	printExp(typeid(int).name());
	printExp(typeid(aInt).name());
	cout<<"变量名称为:  "<<varName(aInt)<<endl;

	cout<<endl;
	BaseDouble base;
	printExpToString(base);
	printExpToString(base+5+4);  //若宏定义中exp不加括号就无法编译了!!!
	printExpToString((LC::Base<int>)DerivedInt());

	cout<<endl;
	DerivedInt derived;
	LC::Base<int>* pBase=&derived;
	LC::Base<int>  baseCast=derived;
	printExpToString(*pBase);
	printExpToString(derived);
	printExpToString(baseCast);

	printExp(typeid(*pBase)==typeid(derived));
	printExp(typeid(baseCast)==typeid(derived));
}
  • 大小: 27.9 KB
分享到:
评论

相关推荐

    C++获取计算机IP地址

    1. **C++基础知识**:首先,你需要对C++语言有基本的理解,包括变量、函数、控制结构等。Visual C++ 6.0是一个经典的IDE,用于编写和调试C++代码。 2. **Winsock库**:在Windows操作系统中,我们通常使用Winsock库...

    C++获取串口的源代码

    根据提供的文件信息,本文将对如何使用C++获取系统中的虚拟串口与实际串口进行详细解析,并基于C++Builder开发环境来进行说明。 ### C++Builder简介 C++Builder是Embarcadero Technologies公司推出的一款集成开发...

    C++青少年编程教案,变量与输入(入门)

    声明时要指定变量的名称和类型,例如`int x`表示定义了一个整数类型的变量x。 - 初始化是给变量赋予初值的过程,如`int x = 10`。声明同时初始化是允许的,但如果没有初始值,变量的值将是未定义的,可能会导致不可...

    C++课程设计_ &#40;5&#41;学生选修课选课管理系统.doc

    `Course`类用于表示课程信息,包含私有成员变量如课程编号、名称、性质等,并提供了输入和输出的成员函数,方便数据的读写。`input()`函数用于从用户处获取课程信息,而`input_1()`则从文件中读取数据。`display()`...

    C++运行时类型信息揭密

    - **`typeid`运算符**:`typeid`可以用于获取变量或类型的信息。例如,`typeid(x)`返回的是变量`x`的类型信息,而`typeid(T)`返回的是类型`T`的信息。 - **`typeinfo`对象**:`typeinfo`对象通常包含以下成员: - `...

    Visual C++代码 获取本地网络信息

    在本文中,我们将深入探讨如何使用Visual C++来获取本地网络信息,包括网络适配器名、网络适配器描述、物理(MAC)地址、IPv4和IPv6地址以及子网掩码。这些信息对于系统管理和网络诊断至关重要。 首先,我们要知道...

    PB调用C++DLL

    确保函数声明符合C调用约定(__cdecl或extern "C"),因为PB不支持C++的名称修饰(name mangling)。 2. **定义函数原型**:在PB中,你需要为DLL中的每个函数创建一个函数原型。这通常在PB的头文件(.h)中完成,...

    c++语言获取本地ip

    ### C++语言获取本地IP地址方法详解 在计算机网络领域,获取本地IP地址是一项非常基础...通过上述介绍,我们可以了解到使用C++获取本地IP地址的基本原理和技术细节。希望这篇文章能够帮助读者理解和掌握这一关键技能。

    C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)

    `BrowsHistory`类中包含一个`std::vector&lt;BrowsData&gt;`成员变量`m_BrowsHistroy`,用于存储获取到的所有历史记录。 `BrowsHistory`类提供了以下关键功能: 1. **URL过滤**:`urlFiltrateIE`、`urlFiltrateChrome`和...

    c++入门教程&demo.pdf

    每个变量都有一个特定的数据类型。 - **常见数据类型**: - `int`: 整数类型,用于存储整数值。 - `float`: 浮点类型,用于存储带小数点的数值。 - `char`: 字符类型,用于存储单个字符。 - `double`: 双精度浮点...

    nameof:现代C ++的Nameof运算符,只需获取变量,类型,函数,宏和枚举的名称

    现代C++中的`nameof`运算符是一个非常实用的工具,它允许程序员在运行时或编译期轻松地获取变量、类型、函数、宏和枚举的名称。这个特性虽然不是C++标准库的一部分,但已经成为了许多开源库和项目中的常见实践,特别...

    dh C++自定义数据类型(新).ppt

    在C++编程语言中,自定义数据类型是一个重要的特性,它允许程序员根据需求创建自己的数据结构,以便更高效地组织和处理数据。本篇内容主要围绕C++中的三种自定义数据类型展开:结构体(Struct)、共用体(Union)和...

    C语言变量类型详解(史上最全)

    - **sizeof**:是一个运算符,用于获取特定类型或变量在内存中所占的字节数。例如,`sizeof(int)`返回`int`类型的大小。 - **注意事项**:`sizeof`是一个静态运算符,其结果在编译阶段就已经确定。避免在`sizeof`...

    c++内部培训ppt

    2. **类和对象**:类是C++中的蓝图,定义了一组数据成员(变量)和成员函数(方法)。对象是类的实例,每个对象都有自己的数据成员副本。通过类和对象,我们可以构建复杂的软件结构。 3. **构造函数与析构函数**:...

    C++调整亮度

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。MFC是微软提供的一套面向对象的类库,它包含了用于构建Windows应用程序所需的各种组件,如窗口、...

    c++获取进程信息列表和进程所调用的dll列表

    总结起来,C++获取进程信息列表和进程所调用的DLL列表涉及的主要知识点包括: 1. Windows API函数的使用,如`EnumProcesses`、`EnumProcessModules`、`GetModuleBaseName`和`GetModuleFileNameEx`。 2. 系统权限的...

    《C++大学教程第五版》课后习题答案

    - `setInstructorName` 和 `getInstructorName`: 分别用于设置和获取教师名称。 - `displayMessage`: 输出欢迎信息,包括课程名称和教师名称。 ### 测试文件 ```cpp #include using std::cout; using std::endl;...

    操作WORD的VBA语言的C++转换

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程等多种编程范式。C++在许多应用领域中都非常流行,尤其是在系统编程、游戏开发等领域有着广泛的...

    c++ 本地机子流量统计

    在C++编程中,实现本地机子流量统计通常涉及到操作系统底层的网络接口信息获取,这通常通过Windows API中的函数来完成。在这个示例中,主要用到了`GetIfTable`函数来获取网络接口表,以此计算网络流量。以下将详细...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    这里,"EasyLogdll"是你的C++动态库的名称,根据实际情况可能需要加上.dll或.so等后缀。 在C++端,你需要实现`processArray`函数,处理输入的二维数组并返回结果到输出数组。注意,C++的二维数组在内存中是一维连续...

Global site tag (gtag.js) - Google Analytics