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



我已经知道,无论是在C还是c++中,都不可能打印变量的名称,这在其他StackOverflow帖子中提到过。

然而,我知道在其他语言中,如Delphi,可以打印对象的类名。我不知道这在c++中是否可能。

因此我的问题:有可能打印对象的objectname吗?

一些背景:我正在编写一个程序,使用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
    }

它通常给出该类型的人类友好版本。根据编译器(和版本)的不同,子字符串可能不同。

示例: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;
}

输出:3 adi

输出格式为class-name的长度后跟它的名称

可以使用预处理器打印变量名:

#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

还包含获取变量类型名称的解决方案。

相关内容

  • 没有找到相关文章

最新更新