#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加括号更安全
out<<varName(aInt)<<endl; \\输出为:  aInt  
2、获取类型名称 采用如下宏定义即可,这个宏定义将表达式x直接转换为对应的字符串: #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; int main(int argc, char** argv) 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)); system("pause"); return 0; 引出问题:给定一个我们自己定义的类A,如何便捷的输出其所有的成员变量类型及值。日常编程中有这样的需求,一个是为了调试,二个是为了在不同模块运行时得到类的属性用于显示及修改。但C++未提供原生的反射机制,所以有了以下思考。核心的需求为:对于一个类型A,我们可以拥有其所有的类型信息。例如: class A int INT; float FLT; }/*MAIN*/ 原因是在链接过程中,编译器找不到模板函数的定义,因为在使用模板时,.h文件中的模板的声明知晓了模板参数的类型,但在.cpp文件中的模版不知道,所以.cpp中模板的定义没法实例化,也就没法在编译阶段生成一份经过实例化的具体的代码,这将导致程序在链接阶段找不到模板函数的实现而报链接错误。这样一来,在调用Add函数的时候,其本质上是调用了上面的经过实例化的模板函数,这样做的好处就是,程序员就可以不用对每一种数据类型都去实现对应的函数,大大提高了效率,而且只实现这么一份通用的模板函数可以使其更易于维护。 最近一个同事问我,怎么能够在C程序中打印出变量名。关于这个问题,我也有考虑过,只是一直没能想到比较好的方法。变量名不像文件名和函数名,可以通过C的库函数直接打印出来。在一番谷歌百度之后,终于知道可以用宏来实现对变量名的打印。具体宏定义如下: #define VNAME(name) (#name) 下面的示例程序演示了这个宏的使用方法。 #include int main() 定义了一个模板函数type_name(),可以对传入的模板类型T进行类型判断,结合指针、左值/右值引用、常类型,准确得出变量的类型。在调用该函数时使用了`decltype`关键字,传入待确定的变量,然后输出变量类型C++ 中可以通过宏来获取函数的名称和变量的名称,__func__ 就是函数的名称获取变量名可以使用以下自定义宏 #define NAME(variable) (#variable) #include <iostream> #define NAME(variable) (#variable) auto mysum(int a, int b) std::cout << "function name: " << __func__ << st 对于C++工程量级比较庞大的代码,代码中的变量、类、函数、结构体的识别都是一件让人头疼的事情,一方面代码越写越多,内容越来越丰富,但是没有办法对已有的代码框架进行高度的整合提炼;另一方面对新人逐渐不友好,增加了学习成本。那么如何获取一些类别信息并进行统筹管理呢? 数据类型 数组名[数组长度];数据类型 数组名[数组长度] = {值1, 值2, ...};若初始化时值的个数 ≠ 数组长度,则会用0补全数据类型 数组名[ ] = {值1, 值2, ...}int main()// 定义1 数据类型 数组名[数组长度];// 声明数组// 赋值 进行初始化i < 5;++i)// 输出数组1// 定义2 数据类型 数组名[数组长度] = {值1, 值2, ...}// 若初始化时值的个数 ≠ 数组长度,则会用0补全i < 5; 返回的类型名称可能是编译器特定的,不同编译器可能会有不同的实现。运算符来获取一个表达式的类型信息。成员函数来获取类型名称。的类型信息,返回值是一个。类型的对象,可以通过其。在C++中,可以使用。