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

时间:2016-09-28 08:40:24

标签: c++ stl

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

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

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

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

4 个答案:

答案 0 :(得分:7)

您可以使用:

typeid(someObject).name();

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

  

返回一个实现定义的以null结尾的字符串   包含类型的名称。不给予任何保证   特别是,返回的字符串对于几种类型可以是相同的   在同一程序的调用之间进行更改。

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

有关.name()的更多信息。

答案 1 :(得分: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
    }

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

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

答案 2 :(得分:0)

您可以使用

$( document ).on('change', 'body:not(.listName) #mainForm input', function(){
// ^^^^^^^^-----------------^^^^^^^^^^^^^^^^^^^

以下是相同的工作代码 -

#include <typeinfo>
typeid(object).name()

输出: 3Adi

输出格式是class-name的长度,后跟其名称。

答案 3 :(得分:0)

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

#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

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