一,
type_info typeid(对象指针) :返回对象的typeinfo类型,类似于c#中的typeof()方法,返回type类型一样。
二,type_info
类type_info(类型信息):存储特定类型的有关信息,定义在<typeinfo>头文件中。type_info类的具体内容由编译器实现来决定,但是至少必须包含返回字符串的name()成员函数。下面是type_info类的VC05实现版本:
class type_info { // VC05中定义的简化
public:
virtual ~type_info();
bool operator==(const type_info& rhs) const;
bool operator!=(const type_info& rhs) const;
int before(const type_info& rhs) const;
const char* name() const;
const char* raw_name() const;
private:
void *_m_data;
char _m_d_name[1];
type_info(const type_info& rhs);
type_info& operator=(const type_info& rhs);
static const char *_Name_base(const type_info *prhs, __type_info_node* __ptype_info_node);
static void _Type_info_dtor(type_info *prhs);
};
三,typename:
8)类型名(typename)对于有的嵌套类中的标识符,本来应该作为类型来处理,但是编译器并不知道这一点,而可能把它当成了静态变量。
对模板中出现的一个标识符,若编译器既可以把它当作一个类型,又可以把它视为一个变量、对象、枚举、函数或模板时,则编译器一般不会认为这个标识符是类型,而认为它是一个其他元素(例如是变量或对象)。
解决办法是,使用标准C++新增加的关键字typename,来明确告诉编译器,它后面的标识符是一个类型名,而不是其他什么东西。
例如:
template<class T> class X {
typename T::id i; // 如果没有typename来说明,编译器会将T::id当成静态变量
public:
void f ( ) { i.g( ); }
};
class Y {
public:
class id {
public:
void g( ) { }
};
};
int main ( ) {
X<Y> xy;
xy.f ( );
}
最后一种用法是说,可以用typename来代替模板声明中的类型参数class,即:可将
template<class T> ……
改为
template<typename T> ……
而且这样更名符其实。因为除了类类型外,基本数据类型和结构等类型,也是可以作为模板的类型参数的。
例如:(能够打印任意标准C++序列容器中的数据的函数模板)
![](https://i-blog.csdnimg.cn/blog_migrate/03a45bd18651a8f0dc01ce2128e498b1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/86a9820b2fbd7ae381f885c9898cc042.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/17326f989324f663c788a0ab7ca73194.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/d427c555d4f9fd22860cdbefe4bc0c85.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/48253d9f4a7ee8a8c058d78aaf3c6bfd.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/c5c4e1aed2332b95a4538ce786b72925.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/621723fe86a3ffe9916baa0dabf189da.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1c2ec481629f9b06d4dd931687840175.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/d1411091f9fc08fd39eea2354c163bf2.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ce5fbd3e18d3b0b1993c4d1abb1f2a2f.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/3bace32d70eadea6906d6103ac855eac.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b54cf177f3579c54ff349b8a9cfbf767.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7e6f2b5ca7d6b715109a29d5c47476bc.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/42e70d454298e16c8f00d29159947557.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/97e75f264ad6a009a141ebaba14916a5.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9282c7ca9fb795d7dbc619d0950e4c88.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9d8473dde9d2983a7e378f9ff324a8.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e618ee2ed5bc0df88ad1d5eca9e9b854.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e4bdd8d09f34fcbf75ac3b735befd512.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b35331060228d874c1b4a93242a58788.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/146113e874e0d71f1cc57f615cf2cc71.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/29feaba58e419aa55ec863d6d88b87b0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/14ce085d11b8a5e6e118f0c66e5de98d.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/dc15d262168f94681e47518a0d1883c5.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9aa2ff07d84a9069f81628bb7fbf6513.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/8985cc0d733cb2bef3addeffd0a783cc.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/5dc8fda7ba719d115e640d1e603b856d.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/492feff9c1901e67d0eeafd44b304250.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e2b85729e91373d10046c4862ed352ef.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/da75b395781b7a73e6ac0c2743554df2.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/dc3e638493e3cf94049b89e319797348.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/be42abc4f6ca4a00e4d3dd060dbbca93.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/aa14696df8632f41b60ffbe37c935a15.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/d35b11625edc10fc7a1d68acee0a60b1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6d88a9175ed52075f6f0010ca312f802.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f35fbd3e33d852704d034a6cc04c558a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/910010425d3868f5c85f62aadcbceb11.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0d6ad910497e01d9f8a9ddc8b61179b.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/2c680321e57a49084005ccb4391bbb45.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/03a2d94ccb8eac338ed4d199f9ee6b8f.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/285f95b863cfa51ebede0ec0a36178ea.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e8ddc37464bfaf497e76ab2063106916.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9c39f27642a0447e235de8d9c0a8e85b.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/24e6dc047c7eaaec300cff482fdc3158.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/fd68afb9f2621ff9667cd2431746129b.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/82698cb3ed1ec059a7dfa0e4a72be1bb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/2a7969ebcd8d95ea90c76ec4c2580308.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/111b78688780d3d54cc76fd847747195.gif)
输出为:
1
2
3
4
注意:关键字typename并不能创建一个新类型名,它只是通知编译器,将标识符解释为类型。若想创建一个新类型名,你可以使用关键字typedef。例如
typename Seq<T>::iterator It; // 告诉编译器iterator是类型,It是该类型的变量
typedef typename Seq<T>::iterator It; // 创建了一个与iterator等价的新类型名It