我已经知道无法在C或C++中打印变量的名称,这在其他StackOverflow帖子中也有提及.
但是我知道在其他语言中,比如Delphi,可以打印对象的类名.我不知道这在C++中是否可行.
因此我的问题是:是否可以打印对象的对象名?
一些背景:我正在编写一个程序,它使用STL向量来跟踪位置和值(两者都在不同的向量中),我想打印向量的内容,在对象名称之前(这样我就可以看我是在看地点还是在看价值观.
您可以使用:
typeid(someObject).name();
Run Code Online (Sandbox Code Playgroud)
但是返回值是实现定义的,并且不需要返回任何有用或可读的内容.
返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.
因此,如果您需要的不仅仅是记录,那么我建议您自己跟踪它们.
更多信息.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
}
Run Code Online (Sandbox Code Playgroud)
它通常提供类型的人类友好版本.根据您的编译器(和版本),子字符串可能不同.
Coliru示例:http://coliru.stacked-crooked.com/a/bcdb77a7519136ea