3

CでもC ++でも、変数の名前を出力できないことはすでに知っています。これは、他のStackOverflowの投稿で言及されています。

ただし、Delphi などの他の言語では、オブジェクトのクラス名を出力できることを知っています。これが C++ で可能かどうかはわかりません。

したがって、私の質問: オブジェクトのオブジェクト名を出力することは可能ですか?

背景: STL ベクトルを使用して位置と値 (両方とも別のベクトル) を追跡するプログラムを作成しており、オブジェクト名を前に付けてベクトルの内容を出力したいと考えています (場所を見ているのか、値を見ているのかを確認してください)。

4

4 に答える 4

7

以下を使用できます。

typeid(someObject).name();

ただし、戻り値は実装定義であり、有用なものや読み取り可能なものを返す必要はまったくありません。

型の名前を含む実装定義のヌル終了文字列を返します。保証はありません。特に、返される文字列はいくつかの型で同一であり、同じプログラムの呼び出し間で変化する可能性があります。

したがって、ロギング以外の目的で必要な場合は、自分で追跡することをお勧めします。

の詳細情報.name()

于 2016-09-28T08:43:57.593 に答える
5

これは私が使用するものです:

#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

于 2016-09-28T08:53:19.647 に答える
1

使用できます

#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

出力形式は、class-name の後にその名前が続く長さです。

于 2016-09-28T08:49:55.870 に答える
1

プリプロセッサを使用して変数の名前を表示することができます。

#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 から入手できます。

変数の型名を取得するためのソリューションも含まれています。

于 2016-09-28T08:58:39.137 に答える