2016-09-28 68 views
3

我已經知道無法在C或C++中打印變量的名稱,這在其他StackOverflow文章中提到過。是否可以打印對象的名稱?

但是我知道在像Delphi這樣的其他語言中,可以打印對象的類名。我不知道這在C++中是否可行。

因此我的問題:是否可以打印對象的對象名?一些背景:我正在寫一個程序,它使用STL向量來跟蹤位置和值(都在單獨的向量中),並且我想打印向量的內容,其前面是對象名稱(這樣我就可以看到我是在看地點還是在看價值)。

+4

對象名稱或對象類型名稱? –

+0

您不能在C/C++中打印變量的名稱並不完全正確。實際上,您可以使用預處理器:'#define VAR_TO_STRING(VAR)#VAR' –

+0

object name,please。 – Dominique

回答

6

您可以使用:

typeid(someObject).name(); 

但返回值是實現定義的,並不需要返回任何有用的或可讀的。

返回一個實現定義的以NULL結尾的字符串 ,其中包含該類型的名稱。沒有保證,在 特別是,返回的字符串可以是相同的幾種類型和 改變同一程序的調用之間。

所以,如果你不僅僅需要記錄,那麼我建議你自己記住它們。

有關.name()的更多信息。

0

您可以使用

#include <typeinfo> 
typeid(object).name() 

這裏是一個相同的工作代碼 -

#include <iostream> 
#include <typeinfo> 
using namespace std; 

class Adi { 
int a; 
int b; 
}; 

int main() { 
Adi obj, obj2; 
cout << typeid(obj2).name() << endl; 
return 0; 
} 

輸出: 3Adi

輸出格式爲類名的長度,然後它名稱。

4

這是我用:

#include <cstddef> 
#include <cstring> 
#include <iostream> 
#include <ostream> 

    template < class T > 
    std::string type_name() 
    { 
#ifdef __clang__ 
     std::string p = __PRETTY_FUNCTION__; 
     return p.substr(43, p.length() - 43 - 1); 
#elif defined(__GNUC__) 
     std::string p = __PRETTY_FUNCTION__; 
#if __cplusplus < 201402 
     return p.substr(57, p.length() - 53 - 62); 
#else 
     return p.substr(46, p.length() - 46 - 1); 
#endif 
#elif defined(_MSC_VER) 
     std::string p = __FUNCSIG__; 
     return p.substr(38, p.length() - 38 - 7); 
#else 
     return std::string("This function is not supported!"); 
#endif 
    } 

通常給人的那種類型的人友好的版本。根據您的編譯器(和版本),子字符串可能會有所不同。

Coliru例子:http://coliru.stacked-crooked.com/a/bcdb77a7519136ea

+0

這只是,*哇*。 +1從現在開始使用它:) – Rakete1111

+2

如果使用的編譯器不是這些,會怎麼樣?我會添加'#else'並返回''這個函數不支持''或者什麼的。 – xinaiz

0

它可以打印使用預處理的變量名:

#define STRINGIFY(a) #a 
#define VAR_NAME(a) STRINGIFY(a) 

int my_var = 42; 
std::cout << "var name = " << VAR_NAME(my_var) << std::endl; 

得你可以使用模板類的重載類的名字,那麼你只需要實現這個類的部分專業化爲每個類型你想獲得的名稱。

template< typename T> class type 
{ 
public: 
    static constexpr const char* name() { 
     return "unknown"; 
    } // end type< T>::name 
}; // type< T> 

template<> class type< int> 
{ 
public: 
    static constexpr const char* name() { 
     return "int"; 
    } 
} 

template<> class type< std::string> 
{ 
public: 
    static constexpr const char* name() { 
     return "std::string"; 
    } 
} 

std::cout << "type name = " << type< int>::name() << std::endl; 

這樣的類和專業所有POD類型和STL容器可以在這裏找到: https://github.com/Gemini67/Celma

還包含一個解決方案,使變量的類型名稱。

相關問題