C++中的typeInfo用法总结

最近在做测试,在大型程序中,模板类型加上继承关系搞得我混乱,还好有tpyeinfo帮助捋顺关系。

typeInfo与typeid简单总结说明:

  1. 和sizeof这类的操作符一样,typeid是C++的关键字之一。
  2. typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)
  3. C++并没有规定typeid实现标准,各个编译器可能会不一样。
  4. 编译器会为每一种typeid操作的类型生成一份保存在数据段的type_info数据。
  5. 每种类型的type_info数据长度依赖于类型名称,至少9个字节。

1. == 和!=操作

判断两个数据类型是否相同,判定的数据可以是自己定义的数据类型。

代码示例:

#include    // std::cout
#include    // operator typeid

struct Base {
     };
struct Derived : Base {
     };
struct Poly_Base {
     virtual void Member(){
     }};
struct Poly_Derived: Poly_Base {
     };

typedef int my_int_type;

int main() {
     
  std::cout << std::boolalpha;

  // fundamental types:
  std::cout << "int vs my_int_type: ";
  std::cout << ( typeid(int) == typeid(my_int_type) ) << '\n';

  // class types:
  std::cout << "Base vs Derived: ";
  std::cout << ( typeid(Base)==typeid(Derived) ) << '\n';

  // non-polymorphic object:
  Base* pbase = new Derived;

  std::cout << "Base vs *pbase: ";
  std::cout << ( typeid(Base)==typeid(*pbase) ) << '\n';

  // polymorphic object:
  Poly_Base* ppolybase = new Poly_Derived;

  std::cout << "Poly_Base vs *ppolybase: ";
  std::cout << ( typeid(Poly_Base)==typeid(*ppolybase) ) << '\n';

  return 0;
}

输出:

int vs my_int_type: true
Base vs Derived: false
Base vs *pbase: true
Poly_Base vs *ppolybase: false

2. name操作

获取数据类型的名字,这个名字是C风格的字符串指针。

##include <iostream>       // std::cout
#include        // operator typeid

struct Base {
     };
struct Derived : Base {
     };
template<class T>
void swap(T a, T b)
{
     
    std::cout << "T is: " << typeid(T).name() << '\n';
    T temp = a;
    a = b;
    b = temp;
}

int main() {
     
    int i;
    int * ptr;
    std::cout << "int is: " << typeid(int).name() << '\n';
    std::cout << "  i is: " << typeid(i).name() << '\n';
    std::cout << " pi is: " << typeid(ptr).name() << '\n';
    std::cout << "*pi is: " << typeid(*ptr).name() << '\n';

    Base base;

    std::cout << "Base is: " << typeid(Base).name() << '\n';
    std::cout << "base is: " << typeid(base).name() << '\n';
    std::cout << "Derived is: " << typeid(Derived).name() << '\n';

    swap(1,2);

    return 0;
}

输出:

int is: i
  i is: i
 pi is: Pi
*pi is: i
Base is: 4Base
base is: 4Base
Derived is: 7Derived
T is: i

你可能感兴趣的:(C/C++编程,typeinfo,C++数据类型)