typeid 与 typeinfo 与typename
来源:互联网 发布:iope神仙水怎么用 知乎 编辑:程序博客网 时间:2024/04/27 20:20
一,
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++序列容器中的数据的函数模板)
// PrintSeq.cpp#include <iostream>
#include <list>
#include <memory>
#include <vector>
using namespace std;
template<class T, template<class U, class = allocator<U> > class Seq>
void printSeq(Seq<T>& seq) {
for (typename Seq<T>::iterator b = seq.begin(); b != seq.end(); b++)
cout << *b << endl;
}
int main ( ) {
// 处理矢量
vector<int> v;
v.push_back(1); v.push_back(2);
printSeq(v);
// 处理表
list<int> lst;
lst.push_back(3); lst.push_back(4);
printSeq(lst);
}
输出为:
1
2
3
4
注意:关键字typename并不能创建一个新类型名,它只是通知编译器,将标识符解释为类型。若想创建一个新类型名,你可以使用关键字typedef。例如
typename Seq<T>::iterator It; // 告诉编译器iterator是类型,It是该类型的变量
typedef typename Seq<T>::iterator It; // 创建了一个与iterator等价的新类型名It
- typeid 与 typeinfo 与typename
- typeid typeinfo
- C++<typeinfo>之typeid
- C++ 关键字 typeid, typename
- C++ 关键字 typeid, typename
- RTTI与typeid
- dynamic_cast,static_cast与typeid
- typeid与typedef
- RTTI(dynamic_cast与typeid)
- 关于type_info与typeid
- typeid 与 dynamic_cast
- dynamic_cast与typeid关键字
- typename与class
- typeid 与 dynamic_cast(C++学习)
- typeid 与 dynamic_cast(C++学习)
- C++中的RTTI 与typeid
- typeid 与 dynamic_cast(C++学习)
- c++中的typename与class
- 获取app运行次数运行时间等信息
- 第17周项目3--求字符串str的长度并返回(用数组名做形参)
- tomcat根据域名绑定一个工程
- 调试PHP程序利用浏览器的Javascript控制台
- 长沙南雅中学一新生发言稿
- typeid 与 typeinfo 与typename
- JVM学习笔记(3)------内存管理和垃圾回收
- 儿歌大全
- 第17周项目2--求字符串str的长度并返回(用指针做形参)
- 初学ZeroMQ
- 解决Eclipse无法打开“Failed to load the JNI shared library”
- JVM学习笔记(4)------内存调优
- 读懂婴幼儿心理学,不要随便责怪孩子
- UVALive - 4015 Caves