`

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
分享到:
评论

相关推荐

    windows下C++对象的反射功能

    该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址,并将指定的对象序列化成完整json字符串,极大降低了开发者工作量。 支持的类型:bool、char、int、float、double、std::vector、std::map、std::...

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

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

    Visual C++开发经验技巧宝典(第1章)

    第1章 语言基础 1 1.1 基础语句 2 0001 注释的使用方法及注意事项 2 0002 使用汇编语言 2 0003 如何使用内联函数 2 0004 如何使用#define自定义宏 3 ...0083 在C++.NET中如何获取系统信息 34

    Visual C++开发经验技巧宝典(第9章)—1

    0587 获取系统环境变量 387 0588 修改计算机名称 388 0589 获取当前屏幕颜色质量 388 0590 获得当前屏幕的分辨率 388 9.8 进程与线程 389 0591 如何使用TLS 389 0592 创建线程 389 0593 创建用户界面...

    C++MFC教程

    Visual C++MFC入门教程 目录 +-- 第一章 VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势 |------ 1.4 利用MFC进行开发的通用方法介绍 |----...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    2.13.1 C++/CLI特有的基本数据类型 84 2.13.2 命令行上的C++/CLI输出 87 2.13.3 C++/CLI特有的功能—— 格式化输出 88 2.13.4 C++/CLI的键盘输入 91 2.13.5 使用safe_cast 92 2.13.6 C++/CLI枚举 92 2.14 ...

    Visual C++开发经验技巧宝典(第9章)

    0587 获取系统环境变量 387 0588 修改计算机名称 388 0589 获取当前屏幕颜色质量 388 0590 获得当前屏幕的分辨率 388 9.8 进程与线程 389 0591 如何使用TLS 389 0592 创建线程 389 0593 创建用户界面...

    最新整理, C++ 学习资料,含C++ 11 / 14 / 17 / 20 / 23 新特性、入门教程、推荐书籍、优质文章、学习

    1983 年,语言的名称从 “带有类的 C” 更改为 C++。C 语言中的 ++ 运算符是用于递增变量的运算符,它使您可以深入了解 Stroustrup 如何看待该语言。在此期间添加了许多新功能,其中最引人注目的是

    C++使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    (TcpClient)result.AsyncState,接着获取数据流传输对象NetworkStream ns = tcpclt.GetStream(),此对象我建议弄成全局变量,以便于其他函数调用,接着我们将挂起数据接收等待,调用ns下的方法BeginRead,入口参数有...

    eclipse 开发c/c++

    在 Eclipse 中安装 CDT 之后, 浏览至 File =&gt; New =&gt; Project,在那里,您将发现三个新的可用项目类型:C(“Standard C Make Project”)、C++(“Standard C++ Make Project”)和“Convert to C or C++ Projects...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.6 变量类型和类型强制转换 67 2.6.1 对操作数进行类型强制转换的规则 68 2.6.2 赋值语句中的类型强制转换 69 2.6.3 显式类型强制转换 69 2.6.4 老式的类型强制转换 70 2.6.5 按位运算符 71 2.7 了解...

    Makefile基础与实战编译大型C-C++项目

    │ 9makefile获取shell结果实现目录创建判断和根据目录生成目标名称 │ 10嵌套make同时编译和清理多项目 │ 11自定义makefile函数调用实现中的install │ 12使用makefile生成后台启动和停止的脚本并安装 │ 13项目...

    C和C++ const的声明差异

    但若要获取与 C++ 中相同的行为,则必须将 const 变量声明为: extern const int i = 2; 如果希望在 C++ 源代码文件声明用于 C 源代码文件的 extern 变量,请使用: extern "C" const int x = 10; 以防止 C++ ...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    6.6.1 通过名称获取系统属性值 152 6.6.2 通过名称获取系统属性 152 6.7 用户和组 153 6.7.1 获取应用程序用户和组ID 153 6.7.2 获取应用程序用户名 154 6.8 进程间通信 154 6.9 小结 154 第7章 原生线程 155...

    VC驿站基础班无KEY高清C++教程下载地址

    ①、当前用户名称、计算机名称的获取; ②、CPU、内存、硬盘信息的获取。 23、进程的相关操作 ①、进程创建的三种方法及CreateProcess参数存在的问题; ②、进程的结束; 进程的枚举 一个简单任务管理器的...

    tiny-json 是一个通用且易于使用的 C 中的 json 解析器,适用于嵌入式系统。它快速、强大_C语言_代码_相关文件_

    您可以一对一地访问 JSON 字段或通过名称获取它们的值。这可以帮助您节省大量源代码行和开发时间。 它不使用递归。 它不使用动态内存。您使用的内存可以静态保留。 数组或 json 对象中的嵌套级别没有限制。 JSON ...

    C++ MFC实现飞机大战游戏

    设置变量的名称、类型、最值等信息。  (4). 在资源视图菜单中,选择相应的菜单项,右击添加时间监听程序,设置函数处理程序名称。  (5). 在处理程序函数中添加相应的信息。 3. 总体设计与详细设计 3.1 系统模块...

    legoev3cpp:用于远程控制 LEGO EV3 的轻量级跨平台 C++14 API

    这是一个轻量级的跨平台 C++14 API,用于远程控制 LEGO EV3。 当前特定于平台的实现文件仅适用于 iOS。 我使用这个库从 iOS 应用程序远程控制我的 EV3。 如果您发现此项目有用,请提出任何添加/更改。 以下是在 ...

    产品类Product的设计

    设计一个产品类 Product ,允许通过如下方式来创建产品对象: 通过指定产品名创建; 通过指定产品名和产品价格创建; 通过指定产品名、产品价格、出厂日期(对象成员)创建; Product 还应该包含如下属性:生产厂家...

    设计一个学生类Student(学生学号、姓名、数学、英语、计算机成绩;)

    分别用来设置和获取学生各个属性值的set()和get()成员函数(例如:设置数学成绩的成员函数setMath().返回数学成绩的成员函数 getMath());计算三门课程总成绩的函数sum();显示学生数据信息的函数print();(注意:...

Global site tag (gtag.js) - Google Analytics