60.左值右值以及类型判断

前提是要包含头文件

1 #include <type_traits>
  • 判断是否是左值引用 是否是右值引用 是否是数组 是否是一个整数 是否是一个类
     1     check(1, 10);
     2     int i(10);
     3     int &ri(i);
     4     int &&rri(i + 3);
     5     //判断是否是左值引用 0不是 1是
     6     cout << is_lvalue_reference<decltype(i)>::value << endl;
     7     cout << is_lvalue_reference<decltype(ri)>::value << endl;
     8     //判断是否是右值引用 0不是 1是
     9     cout << is_rvalue_reference<decltype(rri)>::value << endl;
    10 
    11     int a[5];
    12     int *p = a;
    13     //判断是否是数组
    14     cout << is_array<decltype(a)>::value << endl;
    15     cout << is_array<decltype(p)>::value << endl;
    16 
    17     int num = 10;
    18     double db = 20;
    19     string str1;
    20 
    21     //判断是否是一个整数
    22     cout << is_integral<decltype(num)>::value << endl;
    23     cout << is_integral<decltype(db)>::value << endl;
    24     //判断是否是一个类
    25     cout << is_class<decltype(str1)>::value << endl;
  • 判断模板数据类型是否一致
    1 //判断模板数据类型是否一致
    2 template<class T1,class T2>
    3 void same(const T1 &t1, const T2 &t2)
    4 {
    5     cout << typeid(t1).name() << is_integral<T1>::value << endl;
    6     //判断模板的数据类型
    7     cout << is_same<T1, T2>::value << endl;
    8 }
  • 模板与type高级,根据类型不同选用相应的操作
     1 template<typename T1,typename T2>
     2 void check(const T1 &t1, const T2 &t2,
     3     typename enable_if<is_same<T1, T2>::value>::type *p = nullptr)
     4 {
     5     cout << "  " << t1 << "  " << t2 << endl;
     6     cout << "类型相同" << endl;
     7 }
     8 
     9 template<typename T1, typename T2>
    10 void check(const T1 &t1, const T2 &t2,
    11     typename enable_if<!is_same<T1, T2>::value>::type *p = nullptr)
    12 {
    13     cout << "  " << t1 << "  " << t2 << endl;
    14     cout << "类型相同" << endl;
    15 }
原文地址:https://www.cnblogs.com/xiaochi/p/8567315.html