C++ 类型ID和类型信息类

C++ 类型ID和类型信息类,c++,rtti,typeid,C++,Rtti,Typeid,在type_info类的声明中,我找不到任何数据成员。那么什么是构造的还是破坏的??typeid也没有在其中声明。那么它如何访问type_信息对象呢? 以上陈述是否不完整请说明type\u info类中数据成员的类型typeid是关键字,不是函数,因此不需要也不能声明。它不能是函数,因为表达式typeid(T)其中T是类型将无效。它在编译器中实现,而不是在库中实现 typeinfo不需要任何数据成员;它的name方法被允许从有效的静态数组中为字符串提供服务。例如,考虑一个知道自己名字的简单类:

在type_info类的声明中,我找不到任何数据成员。那么什么是构造的还是破坏的??typeid也没有在其中声明。那么它如何访问type_信息对象呢?

以上陈述是否不完整请说明
type\u info
类中数据成员的类型

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

typeinfo
不需要任何数据成员;它的
name
方法被允许从有效的
静态
数组中为字符串提供服务。例如,考虑一个知道自己名字的简单类:

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
}  

除了
name
,对
typeinfo
对象的主要操作是
=
,可以通过对象之间的简单指针比较来实现;在这种情况下,编译器可以在私有的某个地方构造一个大的
typeinfo[]
数组,而
typeid
只需索引到该数组中即可获取正确的
typeinfo
对象。但是,它的工作方式取决于实现。

没有可以访问的数据成员<代码>type_info由编译器为您实现;细节还没有公布。您可以使用
typeid
获得
type\u info


别担心,编译器的工作就是让它正常工作。

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

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

ISO/IEC 14882:2011 17.5.2.3私有成员[类内对象]/1:

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


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

如果您声称
typeinfo
不允许任何其他成员,您可能应该解释它如何知道通过name提供哪个字符串。@larsmans:您能解释一下为什么“typeinfo不需要任何数据成员”吗更广泛地说,谢谢you@CharlesBailey:我是说
typeinfo
不需要有额外的成员,并不是说它不允许有这些成员。没有数据成员,它怎么知道从静态数组中服务哪个字符串?在Foo示例中,不能有多个实例提供不同的名称,这就是type_info的作用。(您可以使用类型_info的地址作为某个表的键,但为什么要?)@AlanStokes:是的,我确实在考虑从它自己的地址获取索引。如果所有
typeinfo
对象也在一个数组中,那么所涉及的指针杂耍就很简单了。我假设OP正在查看实际的头文件;我后来才意识到,它们是从标准引用的。获得类型的机制是由编译器或C++实现的作者编写的。it@10001001058你的问题我不太清楚。获取类型的机制必须由您正在使用的C++实现的作者实现。
// 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; }