本文转载自:http://cherishlc.iteye.com/blog/1750013
1、获取变量名称
采用如下宏定义即可,这个宏定义将表达式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加括号更安全
用法:
out<<varName(aInt)<<endl; \\输出为: aInt
2、获取类型名称
采用如下宏定义即可,这个宏定义将表达式x直接转换为对应的字符串:
//可能需要#include <typeinfo> 好像不引用也成
cout<<typeid(int).name()<<endl;
更多的用法见最后的程序;
先看一下输出:
3、完整的程序:
#include <string>
#include <sstream>
#include <iostream>
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;
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;
}