C++零基础——左值右值以及类型判断

by LauCyun Jun 18,2015 02:55:16 4,471 views

头文件:#include<type_traits>

1、typetraits,判断类型

(1)is_lvalue_reference、is_rvalue_reference

#include<iostream>
#include<type_traits>
using namespace std;
int main()
{
	int i(10);
	int & ri(i);
	int && rri(i + 3);
	cout << is_integral<decltype(i)>::value << endl;            //true,判断i是否为int类型数据
	cout << is_lvalue_reference<decltype(i)>::value << endl;    //false,判断i是否左值引用
	cout << is_lvalue_reference<decltype(ri)>::value << endl;   //true,判断ri是否左值引用
	cout << is_rvalue_reference<decltype(rri)>::value << endl;  //true,判断rri是否右值引用
	return 0;
}

(2)is_array

#include<iostream>
#include<type_traits>
using namespace std;
int main()
{
	int a[5];
	int *p = a;
	cout << is_array<decltype(a)>::value << endl;  //true,判断是否为数组
	cout << is_array<decltype(p)>::value << endl;  //false
	return 0;
}

(3)is_class

#include<iostream>
#include<type_traits>
#include<string>
using namespace std;
int main()
{
	string str1;
	cout << is_class<string>::value << endl;            //false,判断一个类型T是不是类
	cout << is_class<decltype(str1)>::value << endl;    //true
	return 0;
}

拓展:判断一个类型T是不是类可以判断是不是存在 void(T::*)(void)类型的成员函数, 当然这里并不需要真存在。由于对 struct, class 这些都是满足的, 所以并不能吧 struct 和 class 中区分出来。(4)is_const

#include<iostream>
#include<type_traits>
using namespace std;
int main()
{
	const int a = 10;
	cout << is_const<decltype(a)>::value << endl;  //false,判断是否为const
	cout << is_const<decltype(10)>::value << endl;  //true
	return 0;
}
is_float                                              //浮点类型
is_function                                      //函数
is_member_function_pointer //成员函数指针
is_member_object_pointer     //成员对象指针
is_member_pointer                   //成员指针


2、判断模板类型

#include<iostream>
#include<type_traits>
using namespace std;
template<class T1, class T2>
bool same(const T1 & t1, const T2 & t2)
{
	return is_same<T1, T2>::value; //判断t1、t2的类型是否相同
}
int  main()
{
	cout << same(1, 123) << endl;    //true
	cout << same(1, 123.1) << endl;  
//false
	cout << same(3, "123") << endl;  
//false
	return 0;
}


3、模板与type高级

enable_if 既可以作为返回值也可以作为一个额外的参数。如:

#include<iostream>
#include<type_traits>
using namespace std;
template<typename T1, typename T2>
void check_type(const T1 &t1, const T2 & t2,
	typename enable_if<is_same<T1, T2>::value>::type *p = nullptr)//默认参数
//typename enable_if<!is_same<T1, T2>::value>::type根据is_same<T1, T2>::value创建与之相同的模板
{
	cout << t1 << "与" << t2 << "的类型相同" << endl;
}
template<typename T1, typename T2>
void check_type(const T1 &t1, const T2 & t2,
	typename enable_if<!is_same<T1, T2>::value>::type *p = nullptr)
{
	cout << t1 << "与" << t2 << "的类型不相同" << endl;
}
int main()
{
	check_type(1, 10);      //类型相同
	check_type(1, 10.1);    //类型不相同
	return 0;
}


Tags