typeid和type_info类

时间:2012-02-12 11:29:17

标签: c++ rtti typeid

namespace std {
 class type_info
 {
 public:
  virtual ~type_info(); //type_info can serve as a base class
 // enable comparison
  bool operator==(const type_info& rhs ) const;
 // return !( *this == rhs)
  bool operator!=(const type_info& rhs ) const;
  bool before(const type_info& rhs ) const; // ordering
 //return a C-string containing the type's name
  const char* name() const;
 private:
  //objects of this type cannot be copied
     type_info(const type_info& rhs );
     type_info& operator=(const type_info& rhs);
 }; //type_info
}  

在type_info类的声明中,我找不到任何数据成员。那么构造或破坏了什么?同样也没有声明typeid.So如何访问type_info对象? 以上表示不完整吗? 请告知type_info班级

中的数据成员类型

3 个答案:

答案 0 :(得分:4)

typeid是关键字,而不是函数,因此不需要也不能声明。它不能是一个函数,因为typeid(T)表达式T是一个类型无效。它在编译器中实现,而不是在库中实现。

typeinfo不需要任何数据成员;允许其name方法从有效的static数组中提供字符串。例如,考虑这个知道自己名字的简单类:

// foo.h
class Foo {
    // look ma, no data members!
  public:
    char const *name() const;
};

// foo.cpp
char const NAME[] = "Foo";
char const *Foo::name() const { return NAME; }

name外,typeinfo对象的主要操作是==,可以通过对象之间的简单指针比较来实现;在这种情况下,编译器可以构建一个私有的typeinfo []数组,而typeid只能索引到该数组以获取正确的typeinfo对象。但是,它的工作原理依赖于实现。

答案 1 :(得分:4)

看起来您正在查看来自C ++ 03的typeinfo的公共接口。该标准不限制实现将成员添加到标准类(只要名称来自实现中保留的名称)以使其有效。

在我目前使用的实现std::typeinfo中有一个私有成员const char* __name,用于根据标准的要求实现公共成员函数。

ISO / IEC 14882:2011 17.5.2.3私人成员[objects.within.classes] / 1:

  

第18至30条及附件D未指明类别的表示,故意省略类别成员的说明(9.2)。实现可以根据需要定义静态或非静态类成员,或者两者,以实现第18至30条和附录D中指定的成员函数的语义。

类似的措辞出现在C ++ 03 17.3.2.3中。

答案 2 :(得分:0)

您无法访问任何数据成员。编译器为您实现了type_info;细节不公开。您使用type_info获得typeid

别担心,编译器的工作就是让它全部工作。