#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++中,可以使用。