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
班级
答案 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
。
别担心,编译器的工作就是让它全部工作。