是否可以打印对象的名称?

Dom*_*que 3 c++ stl

我已经知道无法在C或C++中打印变量的名称,这在其他StackOverflow帖子中也有提及.

但是我知道在其他语言中,比如Delphi,可以打印对象的类名.我不知道这在C++中是否可行.

因此我的问题是:是否可以打印对象的对象名?

一些背景:我正在编写一个程序,它使用STL向量来跟踪位置和值(两者都在不同的向量中),我想打印向量的内容,在对象名称之前(这样我就可以看我是在看地点还是在看价值观.

Som*_*ken 7

您可以使用:

typeid(someObject).name();
Run Code Online (Sandbox Code Playgroud)

但是返回值是实现定义的,并且不需要返回任何有用或可读的内容.

返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.

因此,如果您需要的不仅仅是记录,那么我建议您自己跟踪它们.

更多信息.name().


Tre*_*vir 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
    }
Run Code Online (Sandbox Code Playgroud)

它通常提供类型的人类友好版本.根据您的编译器(和版本),子字符串可能不同.

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

  • 如果使用编译器不是这些怎么办?我会添加`#else`并返回""这个功能不支持"`或其他东西. (2认同)