本文转载自: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;
}
本文介绍了一种在C++中通过宏定义来获取变量名称和类型名称的方法,并提供了一个示例程序来展示如何使用这些宏进行输出。此外还展示了如何利用基类和派生类的toString方法来打印对象的类型。
182

被折叠的 条评论
为什么被折叠?



