C++中的typeid使用方法
class base
{
public:
virtual ~base()
{
}
};
class derived : public base
{
public:
virtual ~derived()
{
}
};
上边代码说明了derived和base之间的关系
int a = 1;
string s = "hello world";
int& b = a;
int&& c = 10;
int* pa = &a;
cout << typeid(a).name() << endl;
//输出int
cout << typeid(b).name() << endl;
//输出int
cout << typeid(c).name() << endl;
//输出int
cout << typeid(pa).name() << endl;
//输出int * __ptr64
cout << typeid(s).name() << endl;
//输出class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
由上述代码可知,typeid().name()可以识别出变量类型,但是对于左值引用和右值引用都是直接输出的其母体的数据类型
除此之外,typeid().name()还可以输出自定义的变量类型:
base father;
cout << typeid(father).name() << endl;
//输出class base
但要注意的是:
derived child;
base& cf = child;
cout << typeid(cf).name() << endl;
//输出class derived
在实现了多态后, typeid(父类引用(引用的是子类对象)).name() 输出的是该父类引用指向的子类对象的类型名
typeid().name()的返回值是char const* __ptr64,
cout << typeid(typeid(child).name()).name() << endl;
//输出char const * __ptr64
因此可以通过其来判断两个对象的类型是否相等
if (typeid(child).name() == typeid(cf).name())
{
cout << 1 << endl;
}
//输出1
类模版也同样适用!
template<class T>
struct base
{
virtual ~base()
{
}
};
template<class T>
struct derived : public base<T>
{
virtual ~derived()
{
}
};
int main()
{
base<int> father;
derived<int> child;
base<int>& cf = child;
cout << typeid(father).name() << endl;
//输出struct base<int>
cout << typeid(cf).name() << endl;
//输出struct derived<int>
return 0;
}
总结:typeid().name()可以返回对应变量的类型,()里边可以是类型名,也可以是变量名。除此之外,还可以用其来判断两个对象类型是否相等(对模板也生效)。
注:typeid().name()中的参数如果是引用了子类对象的父类引用,那么其返回的是对应子类的类型(但是必须要实现多态)。