我已經知道無法在C或C++中打印變量的名稱,這在其他StackOverflow文章中提到過。是否可以打印對象的名稱?
但是我知道在像Delphi這樣的其他語言中,可以打印對象的類名。我不知道這在C++中是否可行。
因此我的問題:是否可以打印對象的對象名?一些背景:我正在寫一個程序,它使用STL向量來跟蹤位置和值(都在單獨的向量中),並且我想打印向量的內容,其前面是對象名稱(這樣我就可以看到我是在看地點還是在看價值)。
我已經知道無法在C或C++中打印變量的名稱,這在其他StackOverflow文章中提到過。是否可以打印對象的名稱?
但是我知道在像Delphi這樣的其他語言中,可以打印對象的類名。我不知道這在C++中是否可行。
因此我的問題:是否可以打印對象的對象名?一些背景:我正在寫一個程序,它使用STL向量來跟蹤位置和值(都在單獨的向量中),並且我想打印向量的內容,其前面是對象名稱(這樣我就可以看到我是在看地點還是在看價值)。
您可以使用:
typeid(someObject).name();
但返回值是實現定義的,並不需要返回任何有用的或可讀的。
返回一個實現定義的以NULL結尾的字符串 ,其中包含該類型的名稱。沒有保證,在 特別是,返回的字符串可以是相同的幾種類型和 改變同一程序的調用之間。
所以,如果你不僅僅需要記錄,那麼我建議你自己記住它們。
有關.name()
的更多信息。
您可以使用
#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
輸出格式爲類名的長度,然後它名稱。
這是我用:
#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
這只是,*哇*。 +1從現在開始使用它:) – Rakete1111
如果使用的編譯器不是這些,會怎麼樣?我會添加'#else'並返回''這個函數不支持''或者什麼的。 – xinaiz
它可以打印使用預處理的變量名:
#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
還包含一個解決方案,使變量的類型名稱。
對象名稱或對象類型名稱? –
您不能在C/C++中打印變量的名稱並不完全正確。實際上,您可以使用預處理器:'#define VAR_TO_STRING(VAR)#VAR' –
object name,please。 – Dominique