簡體   English   中英

是否可以打印對象的名稱?

[英]Is it possible to print the name of an object?

我已經知道無法打印變量的名稱,無論是在 C 中還是在 C++ 中,這在其他 StackOverflow 帖子中都有提到。

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

因此我的問題是:是否可以打印對象的對象名稱?

一些背景:我正在編寫一個程序,它使用 STL 向量來跟蹤位置和值(都在單獨的向量中),並且我想打印向量的內容,前面是對象名稱(以便我可以看看我是在查看位置還是查看值)。

您可以使用:

typeid(someObject).name();

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

返回包含類型名稱的實現定義的以空字符結尾的字符串。 不提供任何保證,特別是,返回的字符串對於多種類型可以是相同的,並且在同一程序的調用之間會發生變化。

因此,如果您需要的不僅僅是記錄,那么我建議您自己跟蹤它們。

關於.name()更多信息。

這是我使用的:

#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
    }

它通常提供對人類友好的 Type 版本。 根據您的編譯器(和版本),子字符串可能會有所不同。

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

你可以使用

#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

輸出格式是類名的長度,后跟其名稱。

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

#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

還包含獲取變量類型名稱的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM