C++ 獲取變數名稱 & 獲取型別的名稱
阿新 • • 發佈:2019-01-01
本文轉載自: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; }