1. 程式人生 > >C++ 獲取變數名稱 & 獲取型別的名稱

C++ 獲取變數名稱 & 獲取型別的名稱

本文轉載自: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;
}